add questions

This commit is contained in:
2026-09-01 01:01:37 +07:00
parent 4431a4d491
commit 69666ee264
23 changed files with 4151 additions and 368 deletions
+19 -1
View File
@@ -4,7 +4,7 @@ type IStory interface {
GetStory(scenario *Story, codes []string) *Story
}
// История - это введение и набор точек
// История - это введение, набор точек и вопросы дела
type Story struct {
// Введение - то, что игрок получает в начале игры
@@ -12,6 +12,24 @@ type Story struct {
// Список точек
Places []*Place `json:"places"`
// Вопросы дела - список вопросов, на которые команда должна ответить
Questions []*Question `json:"questions,omitempty"`
}
// Вопрос дела - вопрос, который автор сценария добавляет вместе с
// правильным ответом; команда отвечает на вопросы в конце игры
type Question struct {
// Код - идентификатор вопроса, используется при отправке ответов
Code string `json:"code"`
// Текст вопроса
Text string `json:"text"`
// Правильный ответ - виден только автору и организаторам,
// команде не передаётся
Answer string `json:"answer"`
}
// Введение - текст и аудио, которые игрок получает в начале игры
+9
View File
@@ -29,6 +29,15 @@ func (s *story) GetStory(
Audio: scenario.Introduction.Audio,
}
}
// Вопросы дела передаются команде всегда — с начала игры; правильные
// ответы (Answer) команде не передаются: они нужны только автору и
// организаторам при оценке ответов.
for _, question := range scenario.Questions {
story.Questions = append(story.Questions, &Question{
Code: question.Code,
Text: s.cleaner.ClearText(question.Text),
})
}
for i, code := range codes {
var prevPlace *Place
if i > 0 {
+110
View File
@@ -807,3 +807,113 @@ func Test_story_GetStory(t *testing.T) {
})
}
}
func Test_story_GetStoryQuestions(t *testing.T) {
tests := []struct {
name string
scenario *Story
codes []string
want *Story
}{
{
name: "Вопросы передаются команде с начала игры (без действий)",
scenario: &Story{
Questions: []*Question{
{
Code: "q1",
Text: "Кто убийца?",
Answer: "Дворецкий",
},
},
},
codes: []string{},
want: &Story{
Questions: []*Question{
{
Code: "q1",
Text: "Кто убийца?",
},
},
},
},
{
name: "Правильные ответы не передаются команде",
scenario: &Story{
Questions: []*Question{
{
Code: "q1",
Text: "Вопрос 1.([секрет])",
Answer: "Ответ 1",
},
{
Code: "q2",
Text: "Вопрос 2",
Answer: "Ответ 2",
},
},
},
codes: []string{},
want: &Story{
Questions: []*Question{
{
Code: "q1",
Text: "Вопрос 1.",
},
{
Code: "q2",
Text: "Вопрос 2",
},
},
},
},
{
name: "Вопросы передаются вместе с точками и введением",
scenario: &Story{
Introduction: &Introduction{
Text: "Введение.",
Audio: "intro.mp3",
},
Places: []*Place{
{
Code: "Ы",
Name: "Название точки",
Text: "Текст точки.",
},
},
Questions: []*Question{
{
Code: "q1",
Text: "Вопрос 1",
Answer: "Ответ 1",
},
},
},
codes: []string{"Ы"},
want: &Story{
Introduction: &Introduction{
Text: "Введение.",
Audio: "intro.mp3",
},
Places: []*Place{
{
Code: "Ы",
Name: "Название точки",
Text: "Текст точки.",
},
},
Questions: []*Question{
{
Code: "q1",
Text: "Вопрос 1",
},
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := NewStory(cleaner.NewCleaner()).GetStory(tt.scenario, tt.codes)
assert.Equal(t, got, tt.want)
})
}
}