diff options
| author | Paul Buetow <paul@buetow.org> | 2026-04-19 21:58:20 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-04-19 21:58:20 +0300 |
| commit | baaa2a95b323296992bcce9c8cdc789c1c52d917 (patch) | |
| tree | dbb2f8a231c1827cb571a1733abd5f7c66d31f4f /internal/vocab/reader_test.go | |
| parent | a87e799634280e2b52a5fcacafc44cb28a0d288e (diff) | |
u4: add core infrastructure scaffolding
Diffstat (limited to 'internal/vocab/reader_test.go')
| -rw-r--r-- | internal/vocab/reader_test.go | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/internal/vocab/reader_test.go b/internal/vocab/reader_test.go new file mode 100644 index 0000000..ad43a07 --- /dev/null +++ b/internal/vocab/reader_test.go @@ -0,0 +1,124 @@ +package vocab + +import ( + "os" + "path/filepath" + "reflect" + "testing" +) + +func TestReadVocabularyFile(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + fileContent string + want []WordEntry + }{ + { + name: "empty file", + fileContent: "", + want: nil, + }, + { + name: "words with translations", + fileContent: "ябълка = apple\nкотка = cat\nкуче = dog", + want: []WordEntry{ + {Word: "ябълка", Translation: "apple", NeedsTranslation: false, CardType: CardTypeTranslation}, + {Word: "котка", Translation: "cat", NeedsTranslation: false, CardType: CardTypeTranslation}, + {Word: "куче", Translation: "dog", NeedsTranslation: false, CardType: CardTypeTranslation}, + }, + }, + { + name: "mixed format", + fileContent: `ябълка +котка = cat +куче +хляб = bread`, + want: []WordEntry{ + {Word: "ябълка", Translation: "", NeedsTranslation: false, CardType: CardTypeTranslation}, + {Word: "котка", Translation: "cat", NeedsTranslation: false, CardType: CardTypeTranslation}, + {Word: "куче", Translation: "", NeedsTranslation: false, CardType: CardTypeTranslation}, + {Word: "хляб", Translation: "bread", NeedsTranslation: false, CardType: CardTypeTranslation}, + }, + }, + { + name: "windows line endings", + fileContent: "ябълка\r\nкотка = cat\r\nкуче", + want: []WordEntry{ + {Word: "ябълка", Translation: "", NeedsTranslation: false, CardType: CardTypeTranslation}, + {Word: "котка", Translation: "cat", NeedsTranslation: false, CardType: CardTypeTranslation}, + {Word: "куче", Translation: "", NeedsTranslation: false, CardType: CardTypeTranslation}, + }, + }, + { + name: "multiple equals signs", + fileContent: "test = word = with = equals", + want: []WordEntry{ + {Word: "test", Translation: "word = with = equals", NeedsTranslation: false, CardType: CardTypeTranslation}, + }, + }, + { + name: "english only format", + fileContent: `= apple += cat += dog`, + want: []WordEntry{ + {Word: "", Translation: "apple", NeedsTranslation: true, CardType: CardTypeTranslation}, + {Word: "", Translation: "cat", NeedsTranslation: true, CardType: CardTypeTranslation}, + {Word: "", Translation: "dog", NeedsTranslation: true, CardType: CardTypeTranslation}, + }, + }, + { + name: "word definition format", + fileContent: `ябълка == плод +котка == домашно животно`, + want: []WordEntry{ + {Word: "ябълка", Translation: "плод", NeedsTranslation: false, CardType: CardTypeDefinition}, + {Word: "котка", Translation: "домашно животно", NeedsTranslation: false, CardType: CardTypeDefinition}, + }, + }, + { + name: "mixed formats", + fileContent: `ябълка = apple +котка == домашно животно += dog +стол`, + want: []WordEntry{ + {Word: "ябълка", Translation: "apple", NeedsTranslation: false, CardType: CardTypeTranslation}, + {Word: "котка", Translation: "домашно животно", NeedsTranslation: false, CardType: CardTypeDefinition}, + {Word: "", Translation: "dog", NeedsTranslation: true, CardType: CardTypeTranslation}, + {Word: "стол", Translation: "", NeedsTranslation: false, CardType: CardTypeTranslation}, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + tmpDir := t.TempDir() + tmpFile := filepath.Join(tmpDir, "vocab.txt") + if err := os.WriteFile(tmpFile, []byte(tt.fileContent), 0o644); err != nil { + t.Fatalf("write temp file: %v", err) + } + + got, err := ReadVocabularyFile(tmpFile) + if err != nil { + t.Fatalf("ReadVocabularyFile() error = %v", err) + } + if !reflect.DeepEqual(got, tt.want) { + t.Fatalf("ReadVocabularyFile() = %#v, want %#v", got, tt.want) + } + }) + } +} + +func TestReadVocabularyFile_FileNotFound(t *testing.T) { + t.Parallel() + + _, err := ReadVocabularyFile("/nonexistent/file.txt") + if err == nil { + t.Fatal("expected error for non-existent file") + } +} |
