mirror of
https://github.com/linux-odyssey/linux-odyssey.git
synced 2026-11-05 19:20:12 +08:00
feat: getTasks
This commit is contained in:
1 parent
254e4f75ed
commit
d2cdd1304a
4 files changed
+74
-1
No files matched your search
@@ -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,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)
|
||||
}
|
||||
}
|
||||
@@ -15,3 +15,9 @@ export interface ICommand {
|
||||
export interface ISession {
|
||||
completedEvents: string[]
|
||||
}
|
||||
|
||||
export interface ITask {
|
||||
id: string
|
||||
name: string
|
||||
completed: boolean
|
||||
}
|
||||
@@ -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 },
|
||||
])
|
||||
})
|
||||
})
|
||||
Reference in new issue
Block a user