github.com/exercism/configlet@v3.9.3-0.20200318193232-c70be6269e71+incompatible/track/config_test.go (about) 1 package track 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "fmt" 7 "io/ioutil" 8 "path/filepath" 9 "strings" 10 "testing" 11 12 "github.com/stretchr/testify/assert" 13 ) 14 15 func TestBrokenConfig(t *testing.T) { 16 if _, err := NewConfig("../fixtures/broken.json"); err == nil { 17 t.Errorf("Expected broken JSON") 18 } 19 } 20 21 func TestValidConfig(t *testing.T) { 22 c, err := NewConfig("../fixtures/numbers/config.json") 23 if err != nil { 24 t.Errorf("Expected valid JSON: %s", err) 25 } 26 assert.Equal(t, "Numbers", c.Language) 27 } 28 29 func TestDefaultSolutionPattern(t *testing.T) { 30 c, err := NewConfig("../fixtures/empty.json") 31 assert.NoError(t, err) 32 assert.Equal(t, "[Ee]xample", c.SolutionPattern) 33 } 34 35 func TestDefaultTestPattern(t *testing.T) { 36 c, err := NewConfig("../fixtures/empty.json") 37 assert.NoError(t, err) 38 assert.Equal(t, "(?i)test", c.TestPattern) 39 } 40 41 func TestDefaultIgnorePattern(t *testing.T) { 42 c, err := NewConfig("../fixtures/empty.json") 43 assert.NoError(t, err) 44 assert.Equal(t, "[Ee]xample", c.IgnorePattern) 45 } 46 47 func TestNoChangeWhenMarshalingAcceptableConfig(t *testing.T) { 48 filename := "../fixtures/format/formatted/config.json" 49 src, err := ioutil.ReadFile(filepath.FromSlash(filename)) 50 if err != nil { 51 t.Fatal(err) 52 } 53 54 cfg := Config{} 55 if err := cfg.LoadFromFile(filename); err != nil { 56 t.Fatal(err) 57 } 58 dst, err := cfg.ToJSON() 59 if err != nil { 60 t.Fatal(err) 61 } 62 63 assert.Equal(t, string(src), fmt.Sprintf("%s\n", dst)) 64 } 65 66 func TestMarshalingSortsTopics(t *testing.T) { 67 src := `{"exercises": [{"topics": ["banana","cherry","apple"]}]}` 68 69 var srcCfg Config 70 if err := json.NewDecoder(strings.NewReader(src)).Decode(&srcCfg); err != nil { 71 t.Fatal(err) 72 } 73 74 dst, err := srcCfg.ToJSON() 75 if err != nil { 76 t.Fatal(err) 77 } 78 79 var dstCfg Config 80 if err := json.NewDecoder(bytes.NewReader(dst)).Decode(&dstCfg); err != nil { 81 t.Fatal(err) 82 } 83 84 assert.Equal(t, []string{"apple", "banana", "cherry"}, dstCfg.Exercises[0].Topics) 85 } 86 87 func TestMarshalingNormalizesTopics(t *testing.T) { 88 src := `{"exercises": [{"topics": ["APPLE","f.i$g>","honeydew melon"]}]}` 89 90 var srcCfg Config 91 if err := json.NewDecoder(strings.NewReader(src)).Decode(&srcCfg); err != nil { 92 t.Fatal(err) 93 } 94 95 dst, err := srcCfg.ToJSON() 96 if err != nil { 97 t.Fatal(err) 98 } 99 100 var dstCfg Config 101 if err := json.NewDecoder(bytes.NewReader(dst)).Decode(&dstCfg); err != nil { 102 t.Fatal(err) 103 } 104 105 assert.Equal(t, []string{"apple", "fig", "honeydew_melon"}, dstCfg.Exercises[0].Topics) 106 } 107 108 func TestSemanticsOfMissingTopics(t *testing.T) { 109 src := ` 110 { 111 "exercises": [{ 112 "topics": null 113 }, 114 { 115 "topics": [] 116 }] 117 } 118 ` 119 var srcCfg Config 120 if err := json.NewDecoder(strings.NewReader(src)).Decode(&srcCfg); err != nil { 121 t.Fatal(err) 122 } 123 assert.Nil(t, srcCfg.Exercises[0].Topics) 124 assert.NotEqual(t, []string{}, srcCfg.Exercises[0].Topics) 125 assert.NotNil(t, srcCfg.Exercises[1].Topics) 126 assert.Equal(t, []string{}, srcCfg.Exercises[1].Topics) 127 128 // Round-trip it through serialization. 129 dst, err := srcCfg.ToJSON() 130 if err != nil { 131 t.Fatal(err) 132 } 133 134 var dstCfg Config 135 if err := json.NewDecoder(bytes.NewReader(dst)).Decode(&dstCfg); err != nil { 136 t.Fatal(err) 137 } 138 assert.Nil(t, dstCfg.Exercises[0].Topics) 139 assert.NotEqual(t, []string{}, dstCfg.Exercises[0].Topics) 140 assert.NotNil(t, dstCfg.Exercises[1].Topics) 141 assert.Equal(t, []string{}, dstCfg.Exercises[1].Topics) 142 }