You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

131 line
3.0 KiB

  1. // Copyright 2017 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package pipeline
  5. import (
  6. "bufio"
  7. "bytes"
  8. "encoding/json"
  9. "flag"
  10. "fmt"
  11. "io/ioutil"
  12. "os"
  13. "path"
  14. "path/filepath"
  15. "runtime"
  16. "strings"
  17. "testing"
  18. "golang.org/x/text/language"
  19. )
  20. var genFiles = flag.Bool("gen", false, "generate output files instead of comparing")
  21. // setHelper is testing.T.Helper on Go 1.9+, overridden by go19_test.go.
  22. var setHelper = func(t *testing.T) {}
  23. func TestFullCycle(t *testing.T) {
  24. if runtime.GOOS == "android" {
  25. t.Skip("cannot load outside packages on android")
  26. }
  27. const path = "./testdata"
  28. dirs, err := ioutil.ReadDir(path)
  29. if err != nil {
  30. t.Fatal(err)
  31. }
  32. for _, f := range dirs {
  33. t.Run(f.Name(), func(t *testing.T) {
  34. chk := func(t *testing.T, err error) {
  35. setHelper(t)
  36. if err != nil {
  37. t.Fatal(err)
  38. }
  39. }
  40. dir := filepath.Join(path, f.Name())
  41. pkgPath := fmt.Sprintf("%s/%s", path, f.Name())
  42. config := Config{
  43. SourceLanguage: language.AmericanEnglish,
  44. Packages: []string{pkgPath},
  45. Dir: filepath.Join(dir, "locales"),
  46. GenFile: "catalog_gen.go",
  47. GenPackage: pkgPath,
  48. }
  49. // TODO: load config if available.
  50. s, err := Extract(&config)
  51. chk(t, err)
  52. chk(t, s.Import())
  53. chk(t, s.Merge())
  54. // TODO:
  55. // for range s.Config.Actions {
  56. // // TODO: do the actions.
  57. // }
  58. chk(t, s.Export())
  59. chk(t, s.Generate())
  60. writeJSON(t, filepath.Join(dir, "extracted.gotext.json"), s.Extracted)
  61. checkOutput(t, dir)
  62. })
  63. }
  64. }
  65. func checkOutput(t *testing.T, p string) {
  66. filepath.Walk(p, func(p string, f os.FileInfo, err error) error {
  67. if f.IsDir() {
  68. return nil
  69. }
  70. if filepath.Ext(p) != ".want" {
  71. return nil
  72. }
  73. gotFile := p[:len(p)-len(".want")]
  74. got, err := ioutil.ReadFile(gotFile)
  75. if err != nil {
  76. t.Errorf("failed to read %q", p)
  77. return nil
  78. }
  79. if *genFiles {
  80. if err := ioutil.WriteFile(p, got, 0644); err != nil {
  81. t.Fatal(err)
  82. }
  83. }
  84. want, err := ioutil.ReadFile(p)
  85. if err != nil {
  86. t.Errorf("failed to read %q", p)
  87. } else {
  88. scanGot := bufio.NewScanner(bytes.NewReader(got))
  89. scanWant := bufio.NewScanner(bytes.NewReader(want))
  90. line := 0
  91. clean := func(s string) string {
  92. if i := strings.LastIndex(s, "//"); i != -1 {
  93. s = s[:i]
  94. }
  95. return path.Clean(filepath.ToSlash(s))
  96. }
  97. for scanGot.Scan() && scanWant.Scan() {
  98. got := clean(scanGot.Text())
  99. want := clean(scanWant.Text())
  100. if got != want {
  101. t.Errorf("file %q differs from .want file at line %d:\n\t%s\n\t%s", gotFile, line, got, want)
  102. break
  103. }
  104. line++
  105. }
  106. if scanGot.Scan() || scanWant.Scan() {
  107. t.Errorf("file %q differs from .want file at line %d.", gotFile, line)
  108. }
  109. }
  110. return nil
  111. })
  112. }
  113. func writeJSON(t *testing.T, path string, x interface{}) {
  114. data, err := json.MarshalIndent(x, "", " ")
  115. if err != nil {
  116. t.Fatal(err)
  117. }
  118. if err := ioutil.WriteFile(path, data, 0644); err != nil {
  119. t.Fatal(err)
  120. }
  121. }