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