diff --git a/debug/gdebug/gdebug_testdata.go b/debug/gdebug/gdebug_testdata.go index e7f209970..2d258d5d2 100644 --- a/debug/gdebug/gdebug_testdata.go +++ b/debug/gdebug/gdebug_testdata.go @@ -12,6 +12,12 @@ import ( // TestDataPath retrieves and returns the testdata path of current package. // It is used for unit testing cases only. -func TestDataPath() string { - return CallerDirectory() + string(filepath.Separator) + "testdata" +// The parameter specifies the underlying sub-folders/sub-files, +// which will be joined with current system separator. +func TestDataPath(names ...string) string { + path := CallerDirectory() + string(filepath.Separator) + "testdata" + for _, name := range names { + path += string(filepath.Separator) + name + } + return path } diff --git a/encoding/gjson/gjson_z_example_load_test.go b/encoding/gjson/gjson_z_example_load_test.go new file mode 100644 index 000000000..d2acebb96 --- /dev/null +++ b/encoding/gjson/gjson_z_example_load_test.go @@ -0,0 +1,38 @@ +// Copyright 2017 gf Author(https://github.com/gogf/gf). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package gjson_test + +import ( + "fmt" + "github.com/gogf/gf/debug/gdebug" + "github.com/gogf/gf/encoding/gjson" + "github.com/gogf/gf/os/gfile" +) + +func Example_LoadJson() { + jsonFilePath := gfile.Join(gdebug.TestDataPath(), "json", "data1.json") + j, _ := gjson.Load(jsonFilePath) + fmt.Println(j.Get("name")) + fmt.Println(j.Get("score")) +} + +func Example_LoadXml() { + jsonFilePath := gfile.Join(gdebug.TestDataPath(), "xml", "data1.xml") + j, _ := gjson.Load(jsonFilePath) + fmt.Println(j.Get("doc.name")) + fmt.Println(j.Get("doc.score")) +} + +func Example_LoadContent() { + jsonContent := `{"name":"john", "score":"100"}` + j, _ := gjson.LoadContent(jsonContent) + fmt.Println(j.Get("name")) + fmt.Println(j.Get("score")) + // Output: + // john + // 100 +} diff --git a/encoding/gjson/gjson_z_example_new_test.go b/encoding/gjson/gjson_z_example_new_test.go new file mode 100644 index 000000000..85273fc21 --- /dev/null +++ b/encoding/gjson/gjson_z_example_new_test.go @@ -0,0 +1,70 @@ +// Copyright 2017 gf Author(https://github.com/gogf/gf). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package gjson_test + +import ( + "fmt" + "github.com/gogf/gf/encoding/gjson" +) + +func Example_NewFromJson() { + jsonContent := `{"name":"john", "score":"100"}` + j := gjson.New(jsonContent) + fmt.Println(j.Get("name")) + fmt.Println(j.Get("score")) + // Output: + // john + // 100 +} + +func Example_NewFromXml() { + jsonContent := `john100` + j := gjson.New(jsonContent) + fmt.Println(j.Get("doc.name")) + fmt.Println(j.Get("doc.score")) + // Output: + // john + // 100 +} + +func Example_NewFromStruct() { + type Me struct { + Name string `json:"name"` + Score int `json:"score"` + } + me := Me{ + Name: "john", + Score: 100, + } + j := gjson.New(me) + fmt.Println(j.Get("name")) + fmt.Println(j.Get("score")) + // Output: + // john + // 100 +} + +func Example_NewFromStructWithTag() { + type Me struct { + Name string `tag:"name"` + Score int `tag:"score"` + Title string + } + me := Me{ + Name: "john", + Score: 100, + Title: "engineer", + } + j := gjson.NewWithTag(me, "tag") + fmt.Println(j.Get("name")) + fmt.Println(j.Get("score")) + fmt.Println(j.Get("Title")) + // Output: + // john + // 100 + // engineer +} diff --git a/encoding/gjson/testdata/json/data1.json b/encoding/gjson/testdata/json/data1.json new file mode 100644 index 000000000..7cf9e8cea --- /dev/null +++ b/encoding/gjson/testdata/json/data1.json @@ -0,0 +1 @@ +{"name":"john", "score":"100"} \ No newline at end of file diff --git a/encoding/gjson/testdata/xml/data1.xml b/encoding/gjson/testdata/xml/data1.xml new file mode 100644 index 000000000..b6981440d --- /dev/null +++ b/encoding/gjson/testdata/xml/data1.xml @@ -0,0 +1,5 @@ + + + john + 100 + \ No newline at end of file diff --git a/net/ghttp/ghttp_unit_template_test.go b/net/ghttp/ghttp_unit_template_test.go index c292c6c04..d21dff079 100644 --- a/net/ghttp/ghttp_unit_template_test.go +++ b/net/ghttp/ghttp_unit_template_test.go @@ -47,6 +47,32 @@ func Test_Template_Basic(t *testing.T) { }) } +func Test_Template_Encode(t *testing.T) { + gtest.C(t, func(t *gtest.T) { + v := gview.New(gfile.Join(gdebug.TestDataPath(), "template", "basic")) + v.SetAutoEncode(true) + p := ports.PopRand() + s := g.Server(p) + s.SetView(v) + s.BindHandler("/", func(r *ghttp.Request) { + err := r.Response.WriteTpl("index.html", g.Map{ + "name": "john", + }) + t.Assert(err, nil) + }) + s.SetDumpRouterMap(false) + s.SetPort(p) + s.Start() + defer s.Shutdown() + time.Sleep(100 * time.Millisecond) + client := ghttp.NewClient() + client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p)) + + t.Assert(client.GetContent("/"), "Name:john") + t.Assert(client.GetContent("/"), "Name:john") + }) +} + func Test_Template_Layout1(t *testing.T) { gtest.C(t, func(t *gtest.T) { v := gview.New(gfile.Join(gdebug.TestDataPath(), "template", "layout1")) diff --git a/os/gview/gview_doparse.go b/os/gview/gview_parse.go similarity index 97% rename from os/gview/gview_doparse.go rename to os/gview/gview_parse.go index 5fc05b70f..8e1693963 100644 --- a/os/gview/gview_doparse.go +++ b/os/gview/gview_parse.go @@ -142,7 +142,11 @@ func (view *View) Parse(file string, params ...Params) (result string, err error } buffer := bytes.NewBuffer(nil) if view.config.AutoEncode { - if err := tpl.(*htmltpl.Template).Execute(buffer, variables); err != nil { + newTpl, err := tpl.(*htmltpl.Template).Clone() + if err != nil { + return "", err + } + if err := newTpl.Execute(buffer, variables); err != nil { return "", err } } else { @@ -221,7 +225,11 @@ func (view *View) ParseContent(content string, params ...Params) (string, error) } buffer := bytes.NewBuffer(nil) if view.config.AutoEncode { - if err := tpl.(*htmltpl.Template).Execute(buffer, variables); err != nil { + newTpl, err := tpl.(*htmltpl.Template).Clone() + if err != nil { + return "", err + } + if err := newTpl.Execute(buffer, variables); err != nil { return "", err } } else { diff --git a/os/gview/gview_unit_encode_test.go b/os/gview/gview_unit_encode_test.go new file mode 100644 index 000000000..d3d9efea6 --- /dev/null +++ b/os/gview/gview_unit_encode_test.go @@ -0,0 +1,42 @@ +// Copyright 2020 gf Author(https://github.com/gogf/gf). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package gview_test + +import ( + "github.com/gogf/gf/debug/gdebug" + "github.com/gogf/gf/frame/g" + "github.com/gogf/gf/os/gfile" + "github.com/gogf/gf/os/gview" + "github.com/gogf/gf/test/gtest" + "testing" +) + +func Test_Encode_Parse(t *testing.T) { + gtest.C(t, func(t *gtest.T) { + v := gview.New() + v.SetPath(gdebug.TestDataPath("tpl")) + v.SetAutoEncode(true) + result, err := v.Parse("encode.tpl", g.Map{ + "title": "my title", + }) + t.Assert(err, nil) + t.Assert(result, "
<b>my title</b>
") + }) +} + +func Test_Encode_ParseContent(t *testing.T) { + gtest.C(t, func(t *gtest.T) { + v := gview.New() + tplContent := gfile.GetContents(gdebug.TestDataPath("tpl", "encode.tpl")) + v.SetAutoEncode(true) + result, err := v.ParseContent(tplContent, g.Map{ + "title": "my title", + }) + t.Assert(err, nil) + t.Assert(result, "
<b>my title</b>
") + }) +} diff --git a/os/gview/testdata/tpl/encode.tpl b/os/gview/testdata/tpl/encode.tpl new file mode 100644 index 000000000..a3e9809be --- /dev/null +++ b/os/gview/testdata/tpl/encode.tpl @@ -0,0 +1 @@ +
{{.title}}
\ No newline at end of file