package gotext import ( "bytes" "fmt" "os" g "gobang" ) func src(payload string) string { f := g.Must(os.CreateTemp("", "gotext-temp-*.go")) g.Must(f.WriteString(payload)) g.TErrorIf(f.Close()) return f.Name() } func test_formatComment() { g.TestStart("formatComment()") g.Testing("formatting comments FIXME", func() { table := []struct{ in string out string }{ {"// foo ", "#. foo\n"}, {"/* foo */", "#. foo\n"}, {"/* foo\n */", "#. foo\n"}, {"/* foo\nbar */", "#. foo\n#. bar\n"}, } for _, row := range table { g.TAssertEqual(formatComment(row.in), row.out) } }) } func test_processFiles() { g.TestStart("processFiles()") g.Testing("simple commented file", func() { fname := src(g.Heredoc(` package main func main() { // TRANSLATORS: a comment i18n.G("foo") } `)) defer os.Remove(fname) g.TErrorIf(processFiles(argsT{ subArgs: []string{fname}, keyword: "i18n.G", })) g.TAssertEqual(msgIDs, map[string][]msgID{ "foo": []msgID{ msgID{ comment: "#. TRANSLATORS: a comment\n", fname: fname, line: 5, }, }, }) }) g.Testing("process multiple entries", func() { fname := src(g.Heredoc(` package main func main() { // TRANSLATORS: comment 1 i18n.G("foo") // TRANSLATORS: comment 2 i18n.G("foo") } `)) defer os.Remove(fname) g.TErrorIf(processFiles(argsT{ subArgs: []string{fname}, keyword: "i18n.G", })) g.TAssertEqual(msgIDs, map[string][]msgID{ "foo": []msgID{ { comment: "#. TRANSLATORS: comment 1\n", fname: fname, line: 5, }, { comment: "#. TRANSLATORS: comment 2\n", fname: fname, line: 8, }, }, }) }) g.Testing("process files with concat", func() { msgIDs = nil fname := src(g.Heredoc(` package main func main() { // TRANSLATORS: a comment i18n.G("foo\n" + "bar\n" + "baz") } `)) g.TErrorIf(processFiles(argsT{ subArgs: []string{fname}, keyword: "i18n.G", })) g.TAssertEqual(msgIDs, map[string][]msgID{ "foo\\nbar\\nbaz": []msgID{ { comment: "#. TRANSLATORS: a comment\n", fname: fname, line: 5, }, }, }) }) g.Testing("file with quote", func() { fname := src(fmt.Sprintf(g.Heredoc(` package main func main() { i18n.G(%[1]s foo "bar"%[1]s) } `), "`")) defer os.Remove(fname) g.TErrorIf(processFiles(argsT{ subArgs: []string{fname}, keyword: "i18n.G", })) out := bytes.NewBuffer([]byte("")) writePotFile(out) expected := fmt.Sprintf(g.Heredoc(` #, fuzzy msgid "" msgstr "" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: %s:4 msgid " foo \"bar\"" msgstr "" `), fname) g.TAssertEqual(out.String(), expected) }) } func test_writePotFile() { g.TestStart("writePotFile()") g.Testing("write simple file", func() { msgIDs = map[string][]msgID{ "foo": []msgID{ { fname: "fname", line: 2, comment: "#. foo\n", }, }, } out := bytes.NewBuffer([]byte("")) writePotFile(out) expected := g.Heredoc(` #, fuzzy msgid "" msgstr "" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. foo #: fname:2 msgid "foo" msgstr "" `) g.TAssertEqual(out.String(), expected) }) g.Testing("write template with 2 entries", func() { msgIDs = map[string][]msgID{ "foo": []msgID{ { fname: "fname", line: 2, comment: "#. comment1\n", }, { fname: "fname", line: 4, comment: "#. comment2\n", }, }, } out := bytes.NewBuffer([]byte("")) writePotFile(out) expected := g.Heredoc(` #, fuzzy msgid "" msgstr "" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. comment1 #. comment2 #: fname:2 fname:4 msgid "foo" msgstr "" `) g.TAssertEqual(out.String(), expected) }) g.Testing("template without comment", func() { msgIDs = map[string][]msgID{ "foo": []msgID{ { fname: "fname", line: 2, }, }, } out := bytes.NewBuffer([]byte("")) writePotFile(out) expected := g.Heredoc(` #, fuzzy msgid "" msgstr "" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: fname:2 msgid "foo" msgstr "" `) g.TAssertEqual(out.String(), expected) }) g.Testing("output without location", func() { msgIDs = map[string][]msgID{ "foo": []msgID{ { fname: "fname", line: 2, }, }, } out := bytes.NewBuffer([]byte("")) writePotFile(out) expected := g.Heredoc(` #, fuzzy msgid "" msgstr "" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: fname:2 msgid "foo" msgstr "" `) g.TAssertEqual(out.String(), expected) }) g.Testing("output with hint", func() { msgIDs = map[string][]msgID{ "foo": []msgID{ { fname: "fname", line: 2, formatHint: "c-format", }, }, } out := bytes.NewBuffer([]byte("")) writePotFile(out) expected := g.Heredoc(` #, fuzzy msgid "" msgstr "" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: fname:2 #, c-format msgid "foo" msgstr "" `) g.TAssertEqual(out.String(), expected) }) g.Testing("output with plural", func() { msgIDs = map[string][]msgID{ "foo": []msgID{ { msgidPlural: "plural", fname: "fname", line: 2, }, }, } out := bytes.NewBuffer([]byte("")) writePotFile(out) expected := g.Heredoc(` #, fuzzy msgid "" msgstr "" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: fname:2 msgid "foo" msgid_plural "plural" msgstr[0] "" msgstr[1] "" `) g.TAssertEqual(out.String(), expected) }) g.Testing("multiline output", func() { msgIDs = map[string][]msgID{ "foo\\nbar\\nbaz": []msgID{ { fname: "fname", line: 2, comment: "#. foo\n", }, }, } out := bytes.NewBuffer([]byte("")) writePotFile(out) expected := g.Heredoc(` #, fuzzy msgid "" msgstr "" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. foo #: fname:2 msgid "" "foo\n" "bar\n" "baz" msgstr "" `) g.TAssertEqual(out.String(), expected) }) g.Testing("output tidy output", func() { msgIDs = map[string][]msgID{ "foo\\nbar\\nbaz": []msgID{ { fname: "fname", line: 2, }, }, "zzz\\n": []msgID{ { fname: "fname", line: 4, }, }, } out := bytes.NewBuffer([]byte("")) writePotFile(out) expected := g.Heredoc(` #, fuzzy msgid "" msgstr "" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: fname:2 msgid "" "foo\n" "bar\n" "baz" msgstr "" #: fname:4 msgid "zzz\n" msgstr "" `) g.TAssertEqual(out.String(), expected) }) g.Testing("source with double quotes", func() { fname := src(g.Heredoc(` package main func main() { i18n.G("foo \"bar\"") } `)) defer os.Remove(fname) g.TErrorIf(processFiles(argsT{ subArgs: []string{fname}, keyword: "i18n.G", })) out := bytes.NewBuffer([]byte("")) writePotFile(out) expected := fmt.Sprintf(g.Heredoc(` #, fuzzy msgid "" msgstr "" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: %[1]s:4 msgid "foo \"bar\"" msgstr "" `), fname) g.TAssertEqual(out.String(), expected) }) } func MainTest() { g.Init() test_formatComment() test_processFiles() test_writePotFile() }