2021-01-17 21:46:25 +08:00
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
2019-03-31 23:36:11 +08:00
//
// 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 gxml_test
import (
"bytes"
"strings"
"testing"
2019-07-29 21:01:19 +08:00
2021-10-11 21:41:56 +08:00
"github.com/gogf/gf/v2/encoding/gcharset"
2021-11-13 23:23:55 +08:00
"github.com/gogf/gf/v2/encoding/gjson"
2021-10-11 21:41:56 +08:00
"github.com/gogf/gf/v2/encoding/gxml"
"github.com/gogf/gf/v2/test/gtest"
2019-03-31 23:36:11 +08:00
)
var testData = [ ] struct {
utf8 , other , otherEncoding string
} {
{ "Hello 常用國字標準字體表" , "Hello \xb1`\xa5\u03b0\xea\xa6r\xbc\u0437\u01e6r\xc5\xe9\xaa\xed" , "big5" } ,
{ "Hello 常用國字標準字體表" , "Hello \xb3\xa3\xd3\xc3\x87\xf8\xd7\xd6\x98\xcb\x9c\xca\xd7\xd6\xf3\x77\xb1\xed" , "gbk" } ,
{ "Hello 常用國字標準字體表" , "Hello \xb3\xa3\xd3\xc3\x87\xf8\xd7\xd6\x98\xcb\x9c\xca\xd7\xd6\xf3\x77\xb1\xed" , "gb18030" } ,
}
2019-06-11 19:28:24 +08:00
var testErrData = [ ] struct {
utf8 , other , otherEncoding string
} {
{ "Hello 常用國字標準字體表" , "Hello \xb3\xa3\xd3\xc3\x87\xf8\xd7\xd6\x98\xcb\x9c\xca\xd7\xd6\xf3\x77\xb1\xed" , "gbk" } ,
}
2019-03-31 23:36:11 +08:00
func buildXml ( charset string , str string ) ( string , string ) {
head := ` <?xml version="1.0" encoding="UTF-8"?> `
srcXml := strings . Replace ( head , "UTF-8" , charset , - 1 )
2021-09-27 23:05:46 +08:00
srcParser := gjson . New ( nil )
2019-03-31 23:36:11 +08:00
srcParser . Set ( "name" , str )
srcParser . Set ( "age" , "12" )
s , err := srcParser . ToXml ( )
if err != nil {
return "" , ""
}
srcXml = srcXml + string ( s )
srcXml , err = gcharset . UTF8To ( charset , srcXml )
if err != nil {
return "" , ""
}
dstXml := head + string ( s )
return srcXml , dstXml
}
2021-09-22 19:43:52 +08:00
// 测试XML中字符集的转换
2019-03-31 23:36:11 +08:00
func Test_XmlToJson ( t * testing . T ) {
for _ , v := range testData {
srcXml , dstXml := buildXml ( v . otherEncoding , v . utf8 )
if len ( srcXml ) == 0 && len ( dstXml ) == 0 {
t . Errorf ( "build xml string error. srcEncoding:%s, src:%s, utf8:%s" , v . otherEncoding , v . other , v . utf8 )
}
srcJson , err := gxml . ToJson ( [ ] byte ( srcXml ) )
if err != nil {
t . Errorf ( "gxml.ToJson error. %s" , srcXml )
}
dstJson , err := gxml . ToJson ( [ ] byte ( dstXml ) )
if err != nil {
t . Errorf ( "dstXml to json error. %s" , dstXml )
}
2023-05-25 21:58:11 +08:00
if ! bytes . Equal ( srcJson , dstJson ) {
2019-03-31 23:36:11 +08:00
t . Errorf ( "convert to json error. srcJson:%s, dstJson:%s" , string ( srcJson ) , string ( dstJson ) )
}
}
}
2020-01-04 15:35:21 +08:00
func Test_Decode1 ( t * testing . T ) {
2019-03-31 23:36:11 +08:00
for _ , v := range testData {
srcXml , dstXml := buildXml ( v . otherEncoding , v . utf8 )
if len ( srcXml ) == 0 && len ( dstXml ) == 0 {
t . Errorf ( "build xml string error. srcEncoding:%s, src:%s, utf8:%s" , v . otherEncoding , v . other , v . utf8 )
}
srcMap , err := gxml . Decode ( [ ] byte ( srcXml ) )
if err != nil {
t . Errorf ( "gxml.Decode error. %s" , srcXml )
}
dstMap , err := gxml . Decode ( [ ] byte ( dstXml ) )
if err != nil {
t . Errorf ( "gxml decode error. %s" , dstXml )
}
s := srcMap [ "doc" ] . ( map [ string ] interface { } )
d := dstMap [ "doc" ] . ( map [ string ] interface { } )
for kk , vv := range s {
if vv . ( string ) != d [ kk ] . ( string ) {
t . Errorf ( "convert to map error. src:%v, dst:%v" , vv , d [ kk ] )
}
}
}
}
2020-01-04 15:35:21 +08:00
func Test_Decode2 ( t * testing . T ) {
2020-03-19 22:56:12 +08:00
gtest . C ( t , func ( t * gtest . T ) {
2020-01-04 15:35:21 +08:00
content := `
< ? xml version = "1.0" encoding = "UTF-8" ? > < doc > < username > johngcn < / username > < password1 > 123456 < / password1 > < password2 > 123456 < / password2 > < / doc >
`
m , err := gxml . Decode ( [ ] byte ( content ) )
2022-03-10 11:36:40 +08:00
t . AssertNil ( err )
2020-03-19 22:56:12 +08:00
t . Assert ( m [ "doc" ] . ( map [ string ] interface { } ) [ "username" ] , "johngcn" )
t . Assert ( m [ "doc" ] . ( map [ string ] interface { } ) [ "password1" ] , "123456" )
t . Assert ( m [ "doc" ] . ( map [ string ] interface { } ) [ "password2" ] , "123456" )
2020-01-04 15:35:21 +08:00
} )
}
func Test_DecodeWitoutRoot ( t * testing . T ) {
2020-03-19 22:56:12 +08:00
gtest . C ( t , func ( t * gtest . T ) {
2020-01-04 15:35:21 +08:00
content := `
< ? xml version = "1.0" encoding = "UTF-8" ? > < doc > < username > johngcn < / username > < password1 > 123456 < / password1 > < password2 > 123456 < / password2 > < / doc >
`
m , err := gxml . DecodeWithoutRoot ( [ ] byte ( content ) )
2022-03-10 11:36:40 +08:00
t . AssertNil ( err )
2020-03-19 22:56:12 +08:00
t . Assert ( m [ "username" ] , "johngcn" )
t . Assert ( m [ "password1" ] , "123456" )
t . Assert ( m [ "password2" ] , "123456" )
2020-01-04 15:35:21 +08:00
} )
}
2019-03-31 23:36:11 +08:00
func Test_Encode ( t * testing . T ) {
m := make ( map [ string ] interface { } )
v := map [ string ] interface { } {
"string" : "hello world" ,
"int" : 123 ,
"float" : 100.92 ,
"bool" : true ,
}
m [ "root" ] = interface { } ( v )
xmlStr , err := gxml . Encode ( m )
if err != nil {
t . Errorf ( "encode error." )
}
2021-11-13 23:23:55 +08:00
// t.Logf("%s\n", string(xmlStr))
2019-03-31 23:36:11 +08:00
res := ` <root><bool>true</bool><float>100.92</float><int>123</int><string>hello world</string></root> `
if string ( xmlStr ) != res {
t . Errorf ( "encode error. result: [%s], expect:[%s]" , string ( xmlStr ) , res )
}
}
func Test_EncodeIndent ( t * testing . T ) {
m := make ( map [ string ] interface { } )
v := map [ string ] interface { } {
"string" : "hello world" ,
"int" : 123 ,
"float" : 100.92 ,
"bool" : true ,
}
m [ "root" ] = interface { } ( v )
2019-06-11 17:25:30 +08:00
_ , err := gxml . EncodeWithIndent ( m , "xml" )
2019-03-31 23:36:11 +08:00
if err != nil {
t . Errorf ( "encodeWithIndent error." )
}
2021-11-13 23:23:55 +08:00
// t.Logf("%s\n", string(xmlStr))
2019-03-31 23:36:11 +08:00
}
2019-06-11 19:28:24 +08:00
func TestErrXml ( t * testing . T ) {
for _ , v := range testErrData {
srcXml , dstXml := buildXml ( v . otherEncoding , v . utf8 )
if len ( srcXml ) == 0 && len ( dstXml ) == 0 {
t . Errorf ( "build xml string error. srcEncoding:%s, src:%s, utf8:%s" , v . otherEncoding , v . other , v . utf8 )
}
srcXml = strings . Replace ( srcXml , "gbk" , "XXX" , - 1 )
_ , err := gxml . ToJson ( [ ] byte ( srcXml ) )
if err == nil {
t . Errorf ( "srcXml to json should be failed. %s" , srcXml )
}
}
}
2019-06-12 12:12:00 +08:00
func TestErrCase ( t * testing . T ) {
2020-03-19 22:56:12 +08:00
gtest . C ( t , func ( t * gtest . T ) {
2019-06-12 12:12:00 +08:00
errXml := ` <root><bool>true</bool><float>100.92</float><int>123</int><string>hello world</string> `
_ , err := gxml . ToJson ( [ ] byte ( errXml ) )
if err == nil {
t . Errorf ( "unexpected value: nil" )
}
} )
2020-03-19 22:56:12 +08:00
gtest . C ( t , func ( t * gtest . T ) {
2019-06-12 12:12:00 +08:00
errXml := ` <root><bool>true</bool><float>100.92</float><int>123</int><string>hello world</string> `
_ , err := gxml . Decode ( [ ] byte ( errXml ) )
if err == nil {
t . Errorf ( "unexpected value: nil" )
}
} )
}
2024-09-13 10:37:15 +08:00
func Test_Issue3716 ( t * testing . T ) {
gtest . C ( t , func ( t * gtest . T ) {
var (
xml = ` <Person><Bio>I am a software developer & I love coding.</Bio><Email>john.doe@example.com</Email><Name><>&'"AAA</Name></Person> `
m = map [ string ] interface { } {
"Person" : map [ string ] interface { } {
"Name" : "<>&'\"AAA" ,
"Email" : "john.doe@example.com" ,
"Bio" : "I am a software developer & I love coding." ,
} ,
}
)
gxml . XMLEscapeChars ( true )
defer gxml . XMLEscapeChars ( false )
xb , err := gxml . Encode ( m )
t . AssertNil ( err )
t . Assert ( string ( xb ) , xml )
dm , err := gxml . Decode ( xb )
t . AssertNil ( err )
t . Assert ( dm , m )
} )
}