feat: getTasks

This commit is contained in:
Justin Lin committed 2025-04-21 18:31:33 +08:00
1 parent 254e4f75ed
commit d2cdd1304a
4 files changed
+74 -1

No files matched your search

+24 -1
View File
@@ -1,7 +1,13 @@
/* eslint-disable no-await-in-loop */
import { Event } from './Event'
import { GlobalException } from './Exception'
import { IQuest, IFileExistenceChecker, ICommand, IResponse } from './schema'
import {
IQuest,
IFileExistenceChecker,
ICommand,
IResponse,
ITask,
} from './schema'
import { Stage } from './Stage'
export class Quest {
@@ -67,4 +73,21 @@ export class Quest {
getResponses(completed: string[]): IResponse[] {
return completed.map((id) => this.events.get(id)!.getResponse())
}
getTasks(completed: string[]): ITask[] {
const completedSet = new Set(completed)
const completedStages = this.stages
.filter((stage) => completedSet.has(stage.id))
.map((stage) => ({
id: stage.id,
name: stage.name,
completed: true,
}))
const activeStages = this.getActiveStages(completed).map((stage) => ({
id: stage.id,
name: stage.name,
completed: false,
}))
return [...completedStages, ...activeStages]
}
}
+5
View File
@@ -5,6 +5,7 @@ import {
ISession,
IFileExistenceChecker,
IResponse,
ITask,
} from './schema'
export class Session implements ISession {
@@ -43,4 +44,8 @@ export class Session implements ISession {
getResponses(): IResponse[] {
return this.quest.getResponses(this.completed)
}
getTasks(): ITask[] {
return this.quest.getTasks(this.completed)
}
}
+6
View File
@@ -15,3 +15,9 @@ export interface ICommand {
export interface ISession {
completedEvents: string[]
}
export interface ITask {
id: string
name: string
completed: boolean
}
+39
View File
@@ -12,6 +12,7 @@ const quest: IQuest = {
stages: [
{
id: 'stage1',
name: 'Stage 1',
requirements: [],
condition: {
command: 'echo start',
@@ -20,6 +21,7 @@ const quest: IQuest = {
},
{
id: 'stage2',
name: 'Stage 2',
requirements: ['stage1'],
condition: {
command: 'ls',
@@ -28,6 +30,7 @@ const quest: IQuest = {
},
{
id: 'stage3',
name: 'Stage 3',
requirements: ['stage1'],
condition: {
command: 'mkdir hello',
@@ -36,6 +39,7 @@ const quest: IQuest = {
},
{
id: 'stage4',
name: 'Stage 4',
requirements: ['stage2', 'stage3'],
condition: {
command: 'echo finish',
@@ -129,4 +133,39 @@ describe('Session', () => {
{ type: 'narrative', content: 'Narrative 2' },
])
})
it('should return tasks', () => {
const session = new Session(
{
completedEvents: [],
},
quest,
new MockFileChecker()
)
expect(session.getTasks()).toEqual([
{ id: 'stage1', name: 'Stage 1', completed: false },
])
session.complete('stage1')
expect(session.getTasks()).toEqual([
{ id: 'stage1', name: 'Stage 1', completed: true },
{ id: 'stage2', name: 'Stage 2', completed: false },
{ id: 'stage3', name: 'Stage 3', completed: false },
])
session.complete('stage2')
expect(session.getTasks()).toEqual([
{ id: 'stage1', name: 'Stage 1', completed: true },
{ id: 'stage2', name: 'Stage 2', completed: true },
{ id: 'stage3', name: 'Stage 3', completed: false },
])
session.complete('stage3')
expect(session.getTasks()).toEqual([
{ id: 'stage1', name: 'Stage 1', completed: true },
{ id: 'stage2', name: 'Stage 2', completed: true },
{ id: 'stage3', name: 'Stage 3', completed: true },
{ id: 'stage4', name: 'Stage 4', completed: false },
])
})
})