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  }