class testHandlePart(unittest.TestCase):
    def setUp(self):
        self.handler = MxmlParser.UpdatePart
        self.tags = []
        self.chars = {}
        self.attrs = {}
        self.piece = PieceTree()
        self.data = {}

    def testNoData(self):
        self.assertEqual(None, self.handler(self.tags,self.attrs,self.chars,self.piece, self.data), "ERROR: no tags should return none in TestNodata")

    def testIrrelevantTag(self):
        self.tags.append("wut")
        MxmlParser.part_id = None
        self.assertEqual(None, self.handler(self.tags, self.attrs,self.chars,self.piece, self.data), "ERROR: irrelevant tags should return none in TestIrrelevantTag")

    def testScorePartTag(self):
        MxmlParser.part_id = None
        self.assertEqual(None, MxmlParser.part_id,"ERROR: part_id not none in testScorePartTag")
        self.tags.append("score-part")
        self.attrs["score-part"] = {"id":"P1"}
        self.handler(self.tags,self.attrs,self.chars,self.piece, self.data)
        self.assertEqual(1, len(self.piece.root.GetChildrenIndexes()))

    def testPnameTag(self):
        self.assertEqual(0, len(self.piece.root.GetChildrenIndexes()))
        self.tags.append("score-part")
        self.attrs["score-part"] = {"id":"P1"}
        self.tags.append("part-name")
        self.chars["part-name"] = "will"
        self.handler(self.tags,self.attrs,self.chars,self.piece, self.data)
        self.assertEqual("will", self.piece.getPart("P1").GetItem().name)

    def testPNameWithShortName(self):
        self.assertEqual(0, len(self.piece.root.GetChildrenIndexes()))
        self.tags.append("score-part")
        self.attrs["score-part"] = {"id":"P1"}
        self.tags.append("part-abbreviation")
        self.chars["part-abbreviation"] = "w"
        self.handler(self.tags,self.attrs,self.chars,self.piece, self.data)
        self.assertEqual("w", self.piece.getPart("P1").GetItem().shortname)

    def testPartGroupOpen(self):
        self.tags.append("part-group")
        self.attrs["part-group"] = {"number":"1","type":"start"}
        self.tags.append("score-part")
        self.attrs["score-part"] = {"id":"P1"}
        self.handler(self.tags,self.attrs,self.chars,self.piece, self.data)
        self.tags.append("score-part")
        self.attrs["score-part"] = {"id":"P2"}
        self.handler(self.tags,self.attrs,self.chars,self.piece, self.data)
        self.assertEqual(["P1","P2"], self.piece.getGroup(1))

    def testPartGroupClose(self):
        self.tags.append("part-group")
        self.attrs["part-group"] = {"number":"1","type":"start"}
        self.tags.append("score-part")
        self.attrs["score-part"] = {"id":"P1"}
        self.handler(self.tags,self.attrs,self.chars,self.piece, self.data)
        self.tags.append("part-group")
        self.attrs["part-group"] = {"number":"1","type":"stop"}
        self.handler(self.tags,self.attrs,self.chars,self.piece, self.data)
        self.tags.append("score-part")
        self.attrs["score-part"] = {"id":"P2"}
        self.handler(self.tags,self.attrs,self.chars,self.piece, self.data)
        self.assertEqual(["P1"], self.piece.getGroup(1))
class testHandlePart(unittest.TestCase):

    def setUp(self):
        self.handler = MxmlParser.UpdatePart
        self.tags = []
        self.chars = {}
        self.attrs = {}
        self.piece = PieceTree()
        self.data = {}

    def testNoData(self):
        self.assertEqual(
            None,
            self.handler(
                self.tags,
                self.attrs,
                self.chars,
                self.piece,
                self.data),
            "ERROR: no tags should return none in TestNodata")

    def testIrrelevantTag(self):
        self.tags.append("wut")
        MxmlParser.part_id = None
        self.assertEqual(
            None,
            self.handler(
                self.tags,
                self.attrs,
                self.chars,
                self.piece,
                self.data),
            "ERROR: irrelevant tags should return none in TestIrrelevantTag")

    def testScorePartTag(self):
        MxmlParser.part_id = None
        self.assertEqual(
            None,
            MxmlParser.part_id,
            "ERROR: part_id not none in testScorePartTag")
        self.tags.append("score-part")
        self.attrs["score-part"] = {"id": "P1"}
        self.handler(self.tags, self.attrs, self.chars, self.piece, self.data)
        self.assertEqual(1, len(self.piece.root.GetChildrenIndexes()))

    def testPnameTag(self):
        self.assertEqual(0, len(self.piece.root.GetChildrenIndexes()))
        self.tags.append("score-part")
        self.attrs["score-part"] = {"id": "P1"}
        self.tags.append("part-name")
        self.chars["part-name"] = "will"
        self.handler(self.tags, self.attrs, self.chars, self.piece, self.data)
        self.assertEqual("will", self.piece.getPart("P1").GetItem().name)

    def testPNameWithShortName(self):
        self.assertEqual(0, len(self.piece.root.GetChildrenIndexes()))
        self.tags.append("score-part")
        self.attrs["score-part"] = {"id": "P1"}
        self.tags.append("part-abbreviation")
        self.chars["part-abbreviation"] = "w"
        self.handler(self.tags, self.attrs, self.chars, self.piece, self.data)
        self.assertEqual("w", self.piece.getPart("P1").GetItem().shortname)

    def testPartGroupOpen(self):
        self.tags.append("part-group")
        self.attrs["part-group"] = {"number": "1", "type": "start"}
        self.tags.append("score-part")
        self.attrs["score-part"] = {"id": "P1"}
        self.handler(self.tags, self.attrs, self.chars, self.piece, self.data)
        self.tags.append("score-part")
        self.attrs["score-part"] = {"id": "P2"}
        self.handler(self.tags, self.attrs, self.chars, self.piece, self.data)
        self.assertEqual(["P1", "P2"], self.piece.getGroup(1))

    def testPartGroupClose(self):
        self.tags.append("part-group")
        self.attrs["part-group"] = {"number": "1", "type": "start"}
        self.tags.append("score-part")
        self.attrs["score-part"] = {"id": "P1"}
        self.handler(self.tags, self.attrs, self.chars, self.piece, self.data)
        self.tags.append("part-group")
        self.attrs["part-group"] = {"number": "1", "type": "stop"}
        self.handler(self.tags, self.attrs, self.chars, self.piece, self.data)
        self.tags.append("score-part")
        self.attrs["score-part"] = {"id": "P2"}
        self.handler(self.tags, self.attrs, self.chars, self.piece, self.data)
        self.assertEqual(["P1"], self.piece.getGroup(1))