summaryrefslogtreecommitdiff
path: root/json/json_test.go
blob: 7f5e02eb8e822b4fdb815e598c0da57d9a01bcb4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
package json

import (
	stdlibJson "encoding/json"
	"testing"

	"os"

	parsecJson "github.com/prataprc/goparsec/json"
	"github.com/stretchr/testify/require"
	"kesim.org/goparsify"
)

func TestUnmarshal(t *testing.T) {
	t.Run("basic types", func(t *testing.T) {
		result, err := Unmarshal(`true`)
		require.NoError(t, err)
		require.Equal(t, true, result)

		result, err = Unmarshal(`false`)
		require.NoError(t, err)
		require.Equal(t, false, result)

		result, err = Unmarshal(`null`)
		require.NoError(t, err)
		require.Equal(t, nil, result)

		result, err = Unmarshal(`"true"`)
		require.NoError(t, err)
		require.Equal(t, "true", result)
	})

	t.Run("array", func(t *testing.T) {
		result, err := Unmarshal(`[true, null, false, -1.23e+4]`)
		require.NoError(t, err)
		require.Equal(t, []interface{}{true, nil, false, -1.23e+4}, result)
	})

	t.Run("object", func(t *testing.T) {
		result, err := Unmarshal(`{"true":true, "false":false, "null": null, "number": 404} `)
		require.NoError(t, err)
		require.Equal(t, map[string]interface{}{"true": true, "false": false, "null": nil, "number": int64(404)}, result)
	})
}

func BenchmarkUnmarshalParsec(b *testing.B) {
	bytes := []byte(benchmarkString)

	for i := 0; i < b.N; i++ {
		scanner := parsecJson.NewJSONScanner(bytes)
		_, remaining := parsecJson.Y(scanner)

		require.True(b, remaining.Endof())
	}
}

func BenchmarkUnmarshalParsify(b *testing.B) {
	goparsify.EnableLogging(os.Stdout)
	for i := 0; i < b.N; i++ {
		_, err := Unmarshal(benchmarkString)
		require.NoError(b, err)
	}
	goparsify.DumpDebugStats()
}

func BenchmarkUnmarshalStdlib(b *testing.B) {
	bytes := []byte(benchmarkString)
	var result interface{}
	for i := 0; i < b.N; i++ {
		err := stdlibJson.Unmarshal(bytes, &result)
		require.NoError(b, err)
	}
}

// This string was taken from http://json.org/example.html
const benchmarkString = `{"web-app": {
  "servlet": [
    {
      "servlet-name": "cofaxCDS",
      "servlet-class": "org.cofax.cds.CDSServlet",
      "init-param": {
        "configGlossary:installationAt": "Philadelphia, PA",
        "configGlossary:adminEmail": "ksm@pobox.com",
        "configGlossary:poweredBy": "Cofax",
        "configGlossary:poweredByIcon": "/images/cofax.gif",
        "configGlossary:staticPath": "/content/static",
        "templateProcessorClass": "org.cofax.WysiwygTemplate",
        "templateLoaderClass": "org.cofax.FilesTemplateLoader",
        "templatePath": "templates",
        "templateOverridePath": "",
        "defaultListTemplate": "listTemplate.htm",
        "defaultFileTemplate": "articleTemplate.htm",
        "useJSP": false,
        "jspListTemplate": "listTemplate.jsp",
        "jspFileTemplate": "articleTemplate.jsp",
        "cachePackageTagsTrack": 200,
        "cachePackageTagsStore": 200,
        "cachePackageTagsRefresh": 60,
        "cacheTemplatesTrack": 100,
        "cacheTemplatesStore": 50,
        "cacheTemplatesRefresh": 15,
        "cachePagesTrack": 200,
        "cachePagesStore": 100,
        "cachePagesRefresh": 10,
        "cachePagesDirtyRead": 10,
        "searchEngineListTemplate": "forSearchEnginesList.htm",
        "searchEngineFileTemplate": "forSearchEngines.htm",
        "searchEngineRobotsDb": "WEB-INF/robots.db",
        "useDataStore": true,
        "dataStoreClass": "org.cofax.SqlDataStore",
        "redirectionClass": "org.cofax.SqlRedirection",
        "dataStoreName": "cofax",
        "dataStoreDriver": "com.microsoft.jdbc.sqlserver.SQLServerDriver",
        "dataStoreUrl": "jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon",
        "dataStoreUser": "sa",
        "dataStorePassword": "dataStoreTestQuery",
        "dataStoreTestQuery": "SET NOCOUNT ON;select test='test';",
        "dataStoreLogFile": "/usr/local/tomcat/logs/datastore.log",
        "dataStoreInitConns": 10,
        "dataStoreMaxConns": 100,
        "dataStoreConnUsageLimit": 100,
        "dataStoreLogLevel": "debug",
        "maxUrlLength": 500}},
    {
      "servlet-name": "cofaxEmail",
      "servlet-class": "org.cofax.cds.EmailServlet",
      "init-param": {
      "mailHost": "mail1",
      "mailHostOverride": "mail2"}},
    {
      "servlet-name": "cofaxAdmin",
      "servlet-class": "org.cofax.cds.AdminServlet"},

    {
      "servlet-name": "fileServlet",
      "servlet-class": "org.cofax.cds.FileServlet"},
    {
      "servlet-name": "cofaxTools",
      "servlet-class": "org.cofax.cms.CofaxToolsServlet",
      "init-param": {
        "templatePath": "toolstemplates/",
        "log": 1,
        "logLocation": "/usr/local/tomcat/logs/CofaxTools.log",
        "logMaxSize": "",
        "dataLog": 1,
        "dataLogLocation": "/usr/local/tomcat/logs/dataLog.log",
        "dataLogMaxSize": "",
        "removePageCache": "/content/admin/remove?cache=pages&id=",
        "removeTemplateCache": "/content/admin/remove?cache=templates&id=",
        "fileTransferFolder": "/usr/local/tomcat/webapps/content/fileTransferFolder",
        "lookInContext": 1,
        "adminGroupID": 4,
        "betaServer": true}}],
  "servlet-mapping": {
    "cofaxCDS": "/",
    "cofaxEmail": "/cofaxutil/aemail/*",
    "cofaxAdmin": "/admin/*",
    "fileServlet": "/static/*",
    "cofaxTools": "/tools/*"},

  "taglib": {
    "taglib-uri": "cofax.tld",
    "taglib-location": "/WEB-INF/tlds/cofax.tld"}}}`