package sgml import ( "encoding/xml" "strings" "testing" "github.com/stretchr/testify/assert" "github.com/mayswind/ezbookkeeping/pkg/errs" ) type TestSimpleStruct struct { SGMLName string `sgml:"Root"` Text1 string `sgml:"Text1"` Text2 string `sgml:"Text2"` } type TestNestedStruct1 struct { SGMLName string `sgml:"Root"` Child TestSimpleStruct `sgml:"Child"` Text3 string `sgml:"Text3"` Text4 string `sgml:"Text4"` } type TestNestedStruct2 struct { SGMLName string `sgml:"Root"` Child *TestSimpleStruct `sgml:"Child"` Text3 string `sgml:"Text3"` Text4 string `sgml:"Text4"` } type TestEmbeddedStruct struct { TestSimpleStruct Text5 string `sgml:"Text5"` Text6 string `sgml:"Text6"` } type TestSliceStruct1 struct { SGMLName string `sgml:"Root"` Children []TestSimpleStruct `sgml:"Child"` Text7 string `sgml:"Text7"` } type TestSliceStruct2 struct { SGMLName string `sgml:"Root"` Children []*TestSimpleStruct `sgml:"Child"` Text7 string `sgml:"Text7"` } type TestSimpleStructWithXMLTag struct { XMLName xml.Name `xml:"Root"` Text1 string `xml:"Text1"` Text2 string `xml:"Text2"` } type TestStructWithXMLTag struct { XMLName xml.Name `xml:"Root"` Child TestSimpleStructWithXMLTag `xml:"Child"` Text3 string `xml:"Text3"` Text4 string `xml:"Text4"` } type TestNotExportedFieldStruct struct { SGMLName string `sgml:"Root"` Text1 string `sgml:"Text1"` Text2 string text3 string `sgml:"Text3"` } type TestUnsupportedStruct struct { SGMLName string `sgml:"Root"` Number int `sgml:"Number"` } type TestEmbeddedUnsupportedStruct struct { TestUnsupportedStruct Text1 string `sgml:"Text1"` } func TestDecoderDecode(t *testing.T) { sgmlDecoder := NewDecoder(strings.NewReader( "\n" + "Foo\n" + "Bar\n" + "\n")) testStruct := &TestSimpleStruct{} err := sgmlDecoder.Decode(&testStruct) assert.Nil(t, err) assert.NotNil(t, testStruct) assert.Equal(t, "Foo", testStruct.Text1) assert.Equal(t, "Bar", testStruct.Text2) } func TestDecoderDecode_WithRedundantFields(t *testing.T) { sgmlDecoder := NewDecoder(strings.NewReader( "\n" + "Foo\n" + "Bar\n" + "Hello\n" + "\n" + "World\n" + "\n" + "\n")) testStruct := &TestSimpleStruct{} err := sgmlDecoder.Decode(&testStruct) assert.Nil(t, err) assert.NotNil(t, testStruct) assert.Equal(t, "Foo", testStruct.Text1) assert.Equal(t, "Bar", testStruct.Text2) } func TestDecoderDecode_WithEndElement(t *testing.T) { sgmlDecoder := NewDecoder(strings.NewReader( "\n" + "Foo\n" + "Bar\n" + "\n")) testStruct := &TestSimpleStruct{} err := sgmlDecoder.Decode(&testStruct) assert.Nil(t, err) assert.NotNil(t, testStruct) assert.Equal(t, "Foo", testStruct.Text1) assert.Equal(t, "Bar", testStruct.Text2) } func TestDecoderDecode_WithoutBreakLine(t *testing.T) { sgmlDecoder := NewDecoder(strings.NewReader( "" + "Foo" + "Bar" + "")) testStruct := &TestSimpleStruct{} err := sgmlDecoder.Decode(&testStruct) assert.Nil(t, err) assert.NotNil(t, testStruct) assert.Equal(t, "Foo", testStruct.Text1) assert.Equal(t, "Bar", testStruct.Text2) } func TestDecoderDecode_NestedStruct(t *testing.T) { sgmlDecoder := NewDecoder(strings.NewReader( "\n" + "\n" + "Hello\n" + "World\n" + "\n" + "Foo\n" + "Bar\n" + "\n")) testStruct := &TestNestedStruct1{} err := sgmlDecoder.Decode(&testStruct) assert.Nil(t, err) assert.NotNil(t, testStruct) assert.NotNil(t, testStruct.Child) assert.Equal(t, "Hello", testStruct.Child.Text1) assert.Equal(t, "World", testStruct.Child.Text2) assert.Equal(t, "Foo", testStruct.Text3) assert.Equal(t, "Bar", testStruct.Text4) } func TestDecoderDecode_NestedStructUsingPointer(t *testing.T) { sgmlDecoder := NewDecoder(strings.NewReader( "\n" + "\n" + "Hello\n" + "World\n" + "\n" + "Foo\n" + "Bar\n" + "\n")) testStruct := &TestNestedStruct2{} err := sgmlDecoder.Decode(&testStruct) assert.Nil(t, err) assert.NotNil(t, testStruct) assert.NotNil(t, testStruct.Child) assert.Equal(t, "Hello", testStruct.Child.Text1) assert.Equal(t, "World", testStruct.Child.Text2) assert.Equal(t, "Foo", testStruct.Text3) assert.Equal(t, "Bar", testStruct.Text4) } func TestDecoderDecode_EmbeddedStruct(t *testing.T) { sgmlDecoder := NewDecoder(strings.NewReader( "\n" + "Hello\n" + "World\n" + "Foo\n" + "Bar\n" + "\n")) testStruct := &TestEmbeddedStruct{} err := sgmlDecoder.Decode(&testStruct) assert.Nil(t, err) assert.NotNil(t, testStruct) assert.Equal(t, "Hello", testStruct.Text1) assert.Equal(t, "World", testStruct.Text2) assert.Equal(t, "Foo", testStruct.Text5) assert.Equal(t, "Bar", testStruct.Text6) } func TestDecoderDecode_StructSlice(t *testing.T) { sgmlDecoder := NewDecoder(strings.NewReader( "\n" + "\n" + "Hello\n" + "World\n" + "\n" + "\n" + "Hello2\n" + "World2\n" + "\n" + "Foo\n" + "\n")) testStruct := &TestSliceStruct1{} err := sgmlDecoder.Decode(&testStruct) assert.Nil(t, err) assert.NotNil(t, testStruct) assert.Equal(t, 2, len(testStruct.Children)) assert.Equal(t, "Hello", testStruct.Children[0].Text1) assert.Equal(t, "World", testStruct.Children[0].Text2) assert.Equal(t, "Hello2", testStruct.Children[1].Text1) assert.Equal(t, "World2", testStruct.Children[1].Text2) assert.Equal(t, "Foo", testStruct.Text7) } func TestDecoderDecode_StructSliceUsingPointer(t *testing.T) { sgmlDecoder := NewDecoder(strings.NewReader( "\n" + "\n" + "Hello\n" + "World\n" + "\n" + "\n" + "Hello2\n" + "World2\n" + "\n" + "Foo\n" + "\n")) testStruct := &TestSliceStruct2{} err := sgmlDecoder.Decode(&testStruct) assert.Nil(t, err) assert.NotNil(t, testStruct) assert.Equal(t, 2, len(testStruct.Children)) assert.Equal(t, "Hello", testStruct.Children[0].Text1) assert.Equal(t, "World", testStruct.Children[0].Text2) assert.Equal(t, "Hello2", testStruct.Children[1].Text1) assert.Equal(t, "World2", testStruct.Children[1].Text2) assert.Equal(t, "Foo", testStruct.Text7) } func TestDecoderDecode_UsingXMLTag(t *testing.T) { sgmlDecoder := NewDecoder(strings.NewReader( "\n" + "\n" + "Hello\n" + "World\n" + "\n" + "Foo\n" + "Bar\n" + "\n")) testStruct := &TestStructWithXMLTag{} err := sgmlDecoder.Decode(&testStruct) assert.Nil(t, err) assert.NotNil(t, testStruct) assert.NotNil(t, testStruct.Child) assert.Equal(t, "Hello", testStruct.Child.Text1) assert.Equal(t, "World", testStruct.Child.Text2) assert.Equal(t, "Foo", testStruct.Text3) assert.Equal(t, "Bar", testStruct.Text4) } func TestDecoderDecode_WithNotExportedFields(t *testing.T) { sgmlDecoder := NewDecoder(strings.NewReader( "\n" + "Foo\n" + "Bar\n" + "Hello World\n" + "\n")) testStruct := &TestNotExportedFieldStruct{} err := sgmlDecoder.Decode(&testStruct) assert.Nil(t, err) assert.NotNil(t, testStruct) assert.Equal(t, "Foo", testStruct.Text1) assert.Equal(t, "", testStruct.Text2) assert.Equal(t, "", testStruct.text3) } func TestDecoderDecode_StructWithoutEndElement(t *testing.T) { sgmlDecoder := NewDecoder(strings.NewReader( "\n" + "Foo\n" + "Bar\n")) testStruct := &TestSimpleStruct{} err := sgmlDecoder.Decode(&testStruct) assert.EqualError(t, err, errs.ErrInvalidSGMLFile.Message) sgmlDecoder = NewDecoder(strings.NewReader( "\n" + "\n" + "Hello\n" + "World\n" + "Foo\n" + "Bar\n" + "\n")) testStruct2 := &TestNestedStruct2{} err = sgmlDecoder.Decode(&testStruct2) assert.EqualError(t, err, errs.ErrInvalidSGMLFile.Message) } func TestDecoderDecode_WithNotSupportedField(t *testing.T) { sgmlDecoder := NewDecoder(strings.NewReader( "\n" + "1234\n" + "\n")) testStruct := &TestUnsupportedStruct{} err := sgmlDecoder.Decode(&testStruct) assert.EqualError(t, err, errs.ErrInvalidSGMLFile.Message) } func TestDecoderDecode_WithEmbeddedNotSupportedField(t *testing.T) { sgmlDecoder := NewDecoder(strings.NewReader( "\n" + "1234\n" + "Foo\n" + "\n")) testStruct := &TestEmbeddedUnsupportedStruct{} err := sgmlDecoder.Decode(&testStruct) assert.EqualError(t, err, errs.ErrInvalidSGMLFile.Message) }