xml: move invalid xml tests to their own file
diff --git a/invalid_xml_test.go b/invalid_xml_test.go
new file mode 100644
index 0000000..2901308
--- /dev/null
+++ b/invalid_xml_test.go
@@ -0,0 +1,53 @@
+package plist
+
+import (
+	"bytes"
+	"testing"
+)
+
+var InvalidXMLPlists = []struct {
+	Name string
+	Data string
+}{
+	{"Mismatched tag at root level", "<plist></dict>"},
+	{"Mismatched tag in string", "<string>hello</world>"},
+	{"Mismatched tag in dictionary", "<dict><key>key</key></what>"},
+	{"Truncated integer", `<plist version="1.0"><integer>0x</integer></plist>`},
+	{"Mismatched tag closing dict", "<plist><doct><key>helo</key><string></string></doct></plist>"},
+	{"Dict without key", "<plist><dict><string>helo</string></dict></plist>"},
+	{"Dict without value", "<plist><dict><key>helo</key></dict></plist>"},
+	{"Empty integer", "<plist><integer></integer></plist>"},
+	{"Unparseable integer", "<plist><integer>helo</integer></plist>"},
+	{"Unparseable real", "<plist><real>helo</real></plist>"},
+	{"Unparseable data", "<plist><data>*@&amp;%#helo</data></plist>"},
+	{"Unparseable date", "<plist><date>*@&amp;%#helo</date></plist>"},
+	{"Mismatched tag closing string", "<plist><string></strong></plist>"},
+	{"Unexpected directive in string", "<plist><string><!directive!></string></plist>"},
+	{"Unclosed integer", "<plist><integer>10</plist>"},
+	{"Unclosed real", "<plist><real>10</plist>"},
+	{"Unclosed string", "<plist><string>10</plist>"},
+	{"Unclosed dict", "<plist><dict>10</plist>"},
+	{"Unclosed dict key", "<plist><dict><key>10</plist>"},
+	{"Unclosed plist", "<plist>"},
+	{"Unclosed data", "<plist><data>"},
+	{"Unclosed date", "<plist><date>"},
+	{"Unclosed array", "<plist><array>"},
+	{"Empty document", "<plist/>"},
+	{"Incomplete tag", "<pl"},
+	{"Not an XML document", "bplist00"},
+}
+
+func TestInvalidXMLPlists(t *testing.T) {
+	for _, test := range InvalidXMLPlists {
+		subtest(t, test.Name, func(t *testing.T) {
+			buf := bytes.NewReader([]byte(test.Data))
+			d := newXMLPlistParser(buf)
+			obj, err := d.parseDocument()
+			if err == nil {
+				t.Fatalf("invalid plist failed to throw error; deserialized %v", obj)
+			} else {
+				t.Log(err)
+			}
+		})
+	}
+}
diff --git a/xml_test.go b/xml_test.go
index 0ad2b8f..71f1fbb 100644
--- a/xml_test.go
+++ b/xml_test.go
@@ -24,42 +24,3 @@
 		buf.Seek(0, 0)
 	}
 }
-
-func TestVariousIllegalXMLPlists(t *testing.T) {
-	plists := []string{
-		`<plist version="1.0"><integer>0x</integer></plist>`,
-		"<plist><doct><key>helo</key><string></string></doct></plist>",
-		"<plist><dict><string>helo</string></dict></plist>",
-		"<plist><dict><key>helo</key></dict></plist>",
-		"<plist><integer>helo</integer></plist>",
-		"<plist><integer></integer></plist>",
-		"<plist><real>helo</real></plist>",
-		"<plist><data>*@&amp;%#helo</data></plist>",
-		"<plist><date>*@&amp;%#helo</date></plist>",
-		"<plist><date>*@&amp;%#helo</date></plist>",
-		"<plist><integer>10</plist>",
-		"<plist><real>10</plist>",
-		"<plist><string>10</plist>",
-		"<plist><string></strong></plist>",
-		"<plist><string><!directive!></string></plist>",
-		"<plist><dict>10</plist>",
-		"<plist><dict><key>10</plist>",
-		"<plist>",
-		"<plist><data>",
-		"<plist><date>",
-		"<plist><array>",
-		"<plist/>",
-		"<pl",
-		"bplist00",
-	}
-
-	for _, plist := range plists {
-		buf := bytes.NewReader([]byte(plist))
-		d := newXMLPlistParser(buf)
-		obj, err := d.parseDocument()
-		t.Logf("Error: %v", err)
-		if obj != nil && err == nil {
-			t.Error("Expected error, received nothing.")
-		}
-	}
-}