1// This is a support file for toml_testgen_test.go 2package toml 3 4import ( 5 "bytes" 6 "encoding/json" 7 "fmt" 8 "reflect" 9 "testing" 10 "time" 11 12 "github.com/davecgh/go-spew/spew" 13) 14 15func testgenInvalid(t *testing.T, input string) { 16 t.Logf("Input TOML:\n%s", input) 17 tree, err := Load(input) 18 if err != nil { 19 return 20 } 21 22 typedTree := testgenTranslate(*tree) 23 24 buf := new(bytes.Buffer) 25 if err := json.NewEncoder(buf).Encode(typedTree); err != nil { 26 return 27 } 28 29 t.Fatalf("test did not fail. resulting tree:\n%s", buf.String()) 30} 31 32func testgenValid(t *testing.T, input string, jsonRef string) { 33 t.Logf("Input TOML:\n%s", input) 34 tree, err := Load(input) 35 if err != nil { 36 t.Fatalf("failed parsing toml: %s", err) 37 } 38 39 typedTree := testgenTranslate(*tree) 40 41 buf := new(bytes.Buffer) 42 if err := json.NewEncoder(buf).Encode(typedTree); err != nil { 43 t.Fatalf("failed translating to JSON: %s", err) 44 } 45 46 var jsonTest interface{} 47 if err := json.NewDecoder(buf).Decode(&jsonTest); err != nil { 48 t.Logf("translated JSON:\n%s", buf.String()) 49 t.Fatalf("failed decoding translated JSON: %s", err) 50 } 51 52 var jsonExpected interface{} 53 if err := json.NewDecoder(bytes.NewBufferString(jsonRef)).Decode(&jsonExpected); err != nil { 54 t.Logf("reference JSON:\n%s", jsonRef) 55 t.Fatalf("failed decoding reference JSON: %s", err) 56 } 57 58 if !reflect.DeepEqual(jsonExpected, jsonTest) { 59 t.Logf("Diff:\n%s", spew.Sdump(jsonExpected, jsonTest)) 60 t.Fatal("parsed TOML tree is different than expected structure") 61 } 62} 63 64func testgenTranslate(tomlData interface{}) interface{} { 65 switch orig := tomlData.(type) { 66 case map[string]interface{}: 67 typed := make(map[string]interface{}, len(orig)) 68 for k, v := range orig { 69 typed[k] = testgenTranslate(v) 70 } 71 return typed 72 case *Tree: 73 return testgenTranslate(*orig) 74 case Tree: 75 keys := orig.Keys() 76 typed := make(map[string]interface{}, len(keys)) 77 for _, k := range keys { 78 typed[k] = testgenTranslate(orig.GetPath([]string{k})) 79 } 80 return typed 81 case []*Tree: 82 typed := make([]map[string]interface{}, len(orig)) 83 for i, v := range orig { 84 typed[i] = testgenTranslate(v).(map[string]interface{}) 85 } 86 return typed 87 case []map[string]interface{}: 88 typed := make([]map[string]interface{}, len(orig)) 89 for i, v := range orig { 90 typed[i] = testgenTranslate(v).(map[string]interface{}) 91 } 92 return typed 93 case []interface{}: 94 typed := make([]interface{}, len(orig)) 95 for i, v := range orig { 96 typed[i] = testgenTranslate(v) 97 } 98 return testgenTag("array", typed) 99 case time.Time: 100 return testgenTag("datetime", orig.Format("2006-01-02T15:04:05Z")) 101 case bool: 102 return testgenTag("bool", fmt.Sprintf("%v", orig)) 103 case int64: 104 return testgenTag("integer", fmt.Sprintf("%d", orig)) 105 case float64: 106 return testgenTag("float", fmt.Sprintf("%v", orig)) 107 case string: 108 return testgenTag("string", orig) 109 } 110 111 panic(fmt.Sprintf("Unknown type: %T", tomlData)) 112} 113 114func testgenTag(typeName string, data interface{}) map[string]interface{} { 115 return map[string]interface{}{ 116 "type": typeName, 117 "value": data, 118 } 119} 120