diff options
Diffstat (limited to 'vendor/github.com/tdewolff/minify/xml/xml_test.go')
-rw-r--r-- | vendor/github.com/tdewolff/minify/xml/xml_test.go | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/vendor/github.com/tdewolff/minify/xml/xml_test.go b/vendor/github.com/tdewolff/minify/xml/xml_test.go new file mode 100644 index 0000000..5d99809 --- /dev/null +++ b/vendor/github.com/tdewolff/minify/xml/xml_test.go @@ -0,0 +1,129 @@ +package xml // import "github.com/tdewolff/minify/xml" + +import ( + "bytes" + "fmt" + "os" + "regexp" + "testing" + + "github.com/tdewolff/minify" + "github.com/tdewolff/test" +) + +func TestXML(t *testing.T) { + xmlTests := []struct { + xml string + expected string + }{ + {"<!-- comment -->", ""}, + {"<A>x</A>", "<A>x</A>"}, + {"<a><b>x</b></a>", "<a><b>x</b></a>"}, + {"<a><b>x\ny</b></a>", "<a><b>x\ny</b></a>"}, + {"<a> <![CDATA[ a ]]> </a>", "<a>a</a>"}, + {"<a >a</a >", "<a>a</a>"}, + {"<?xml version=\"1.0\" ?>", "<?xml version=\"1.0\"?>"}, + {"<x></x>", "<x/>"}, + {"<x> </x>", "<x/>"}, + {"<x a=\"b\"></x>", "<x a=\"b\"/>"}, + {"<x a=\"\"></x>", "<x a=\"\"/>"}, + {"<x a=a></x>", "<x a=a/>"}, + {"<x a=\" a \n\r\t b \"/>", "<x a=\" a b \"/>"}, + {"<x a=\"'b"\"></x>", "<x a=\"'b"\"/>"}, + {"<x a=\"""'\"></x>", "<x a='\"\"''/>"}, + {"<!DOCTYPE foo SYSTEM \"Foo.dtd\">", "<!DOCTYPE foo SYSTEM \"Foo.dtd\">"}, + {"text <!--comment--> text", "text text"}, + {"text\n<!--comment-->\ntext", "text\ntext"}, + {"<!doctype html>", "<!doctype html=>"}, // bad formatted, doctype must be uppercase and html must have attribute value + {"<x>\n<!--y-->\n</x>", "<x></x>"}, + {"<style>lala{color:red}</style>", "<style>lala{color:red}</style>"}, + {`cats and dogs `, `cats and dogs`}, + + {`</0`, `</0`}, // go fuzz + } + + m := minify.New() + for _, tt := range xmlTests { + t.Run(tt.xml, func(t *testing.T) { + r := bytes.NewBufferString(tt.xml) + w := &bytes.Buffer{} + err := Minify(m, w, r, nil) + test.Minify(t, tt.xml, err, w.String(), tt.expected) + }) + } +} + +func TestXMLKeepWhitespace(t *testing.T) { + xmlTests := []struct { + xml string + expected string + }{ + {`cats and dogs `, `cats and dogs`}, + {` <div> <i> test </i> <b> test </b> </div> `, `<div> <i> test </i> <b> test </b> </div>`}, + {"text\n<!--comment-->\ntext", "text\ntext"}, + {"text\n<!--comment-->text<!--comment--> text", "text\ntext text"}, + {"<x>\n<!--y-->\n</x>", "<x>\n</x>"}, + {"<style>lala{color:red}</style>", "<style>lala{color:red}</style>"}, + {"<x> <?xml?> </x>", "<x><?xml?> </x>"}, + {"<x> <![CDATA[ x ]]> </x>", "<x> x </x>"}, + {"<x> <![CDATA[ <<<<< ]]> </x>", "<x><![CDATA[ <<<<< ]]></x>"}, + } + + m := minify.New() + xmlMinifier := &Minifier{KeepWhitespace: true} + for _, tt := range xmlTests { + t.Run(tt.xml, func(t *testing.T) { + r := bytes.NewBufferString(tt.xml) + w := &bytes.Buffer{} + err := xmlMinifier.Minify(m, w, r, nil) + test.Minify(t, tt.xml, err, w.String(), tt.expected) + }) + } +} + +func TestReaderErrors(t *testing.T) { + r := test.NewErrorReader(0) + w := &bytes.Buffer{} + m := minify.New() + err := Minify(m, w, r, nil) + test.T(t, err, test.ErrPlain, "return error at first read") +} + +func TestWriterErrors(t *testing.T) { + errorTests := []struct { + xml string + n []int + }{ + {`<!DOCTYPE foo>`, []int{0}}, + {`<?xml?>`, []int{0, 1}}, + {`<a x=y z="val">`, []int{0, 1, 2, 3, 4, 8, 9}}, + {`<foo/>`, []int{1}}, + {`</foo>`, []int{0}}, + {`<foo></foo>`, []int{1}}, + {`<![CDATA[data<<<<<]]>`, []int{0}}, + {`text`, []int{0}}, + } + + m := minify.New() + for _, tt := range errorTests { + for _, n := range tt.n { + t.Run(fmt.Sprint(tt.xml, " ", tt.n), func(t *testing.T) { + r := bytes.NewBufferString(tt.xml) + w := test.NewErrorWriter(n) + err := Minify(m, w, r, nil) + test.T(t, err, test.ErrPlain) + }) + } + } +} + +//////////////////////////////////////////////////////////////// + +func ExampleMinify() { + m := minify.New() + m.AddFuncRegexp(regexp.MustCompile("[/+]xml$"), Minify) + + if err := m.Minify("text/xml", os.Stdout, os.Stdin); err != nil { + panic(err) + } +} |