#include "pch.h"
#include "CppUnitTest.h"
#include <XML.h>

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace FrameworkTests
{
    TEST_CLASS(XMLParserTests)
    {
    public:
        TEST_METHOD(EmptyElementTest)
        {
            Framework::XML::Element* element = new Framework::XML::Element("<xml attr attr2=\"\" attr3=\"true\"/>");
            Assert::IsTrue(element->getAttributeCount() == 3, L"One ore more xml attributes are missing");
            Assert::IsTrue(element->getName().istGleich("xml"), L"Der Element Name ist falsch");
            Assert::IsTrue(element->getChildCount() == 0, L"Das Element sollte keine Kinder haben");
            Assert::IsTrue(element->hasAttribute("attr"), L"Das Attribut attr fehlt");
            Assert::IsTrue(element->hasAttribute("attr2"), L"Das Attribut attr2 fehlt");
            Assert::IsTrue(element->hasAttribute("attr3"), L"Das Attribut attr3 fehlt");
            Assert::IsTrue(element->hasAttribute("") == 0, L"Es gibt ein falsches Attribut");
            Assert::IsTrue(element->getAttributeName(0).istGleich("attr"), L"Der Attribut name ist falsch");
            Assert::IsTrue(element->getAttributeName(1).istGleich("attr2"), L"Der Attribut name ist falsch");
            Assert::IsTrue(element->getAttributeName(2).istGleich("attr3"), L"Der Attribut name ist falsch");
            Assert::IsTrue(element->getAttributeValue("attr").istGleich(""), L"Der Wert des Attributes ist falsch");
            Assert::IsTrue(element->getAttributeValue("attr2").istGleich(""), L"Der Wert des Attributes ist falsch");
            Assert::IsTrue(element->getAttributeValue("attr3").istGleich("true"), L"Der Wert des Attributes ist falsch");
            element->release();
        }

        TEST_METHOD(ChildrenElementTest)
        {
            Framework::XML::Element* element = new Framework::XML::Element("<xml><a1/><a2/></xml>");
            Assert::IsTrue(element->getAttributeCount() == 0, L"Die Anzahl der Attribute stimmt nicht");
            Assert::IsTrue(element->getName().istGleich("xml"), L"Der Element Name ist falsch");
            Assert::IsTrue(element->getChildCount() == 2, L"Die Anzahl der Kinder ist falsch");
            Assert::IsTrue(element->zChild(0)->getAttributeCount() == 0, L"Die Anzahl der Attribute stimmt nicht");
            Assert::IsTrue(element->zChild(1)->getAttributeCount() == 0, L"Die Anzahl der Attribute stimmt nicht");
            Assert::IsTrue(element->zChild(0)->getName().istGleich("a1"), L"Der Element Name ist falsch");
            Assert::IsTrue(element->zChild(1)->getName().istGleich("a2"), L"Der Element Name ist falsch");
            element->release();
        }

        TEST_METHOD(WhitespaceTest)
        {
            Framework::XML::Element* element = new Framework::XML::Element("<xml \t \r\n \t > \r\n <a1 x y z=\"\"/> <a2/>\t</xml     >");
            Assert::IsTrue(element->getAttributeCount() == 0, L"Die Anzahl der Attribute stimmt nicht");
            Assert::IsTrue(element->getName().istGleich("xml"), L"Der Element Name ist falsch");
            Assert::IsTrue(element->getChildCount() == 2, L"Die Anzahl der Kinder ist falsch");
            Assert::IsTrue(element->zChild(0)->getAttributeCount() == 3, L"Die Anzahl der Attribute stimmt nicht");
            Assert::IsTrue(element->zChild(1)->getAttributeCount() == 0, L"Die Anzahl der Attribute stimmt nicht");
            Assert::IsTrue(element->zChild(0)->getName().istGleich("a1"), L"Der Element Name ist falsch");
            Assert::IsTrue(element->zChild(1)->getName().istGleich("a2"), L"Der Element Name ist falsch");
            element->release();
        }
    };

    TEST_CLASS(XMLEditorTests)
    {
    public:
        TEST_METHOD(SetAttributeTest)
        {
            Framework::XML::Element* element = new Framework::XML::Element("<xml><a1 x y z=\"\"/><a2/></xml>");
            element->selectChildren().setAttribute("x", "true");
            Assert::IsTrue(element->getName().istGleich("xml"), L"Der Element Name ist falsch");
            Assert::IsTrue(element->getChildCount() == 2, L"Die Anzahl der Kinder ist falsch");
            Assert::IsTrue(element->zChild(0)->getAttributeCount() == 3, L"Die Anzahl der Attribute stimmt nicht");
            Assert::IsTrue(element->zChild(1)->getAttributeCount() == 1, L"Die Anzahl der Attribute stimmt nicht");
            Assert::IsTrue(element->zChild(0)->getName().istGleich("a1"), L"Der Element Name ist falsch");
            Assert::IsTrue(element->zChild(1)->getName().istGleich("a2"), L"Der Element Name ist falsch");
            Assert::IsTrue(element->zChild(0)->getAttributeValue("x").istGleich("true"), L"Der Attribut wert ist falsch");
            Assert::IsTrue(element->zChild(1)->getAttributeValue("x").istGleich("true"), L"Der Attribut wert ist falsch");
            element->release();
        }

        TEST_METHOD(RemoveAttributeTest)
        {
            Framework::XML::Element* element = new Framework::XML::Element("<xml><a1 x y z=\"\"/><a2/></xml>");
            element->selectChildren().removeAttribute("x");
            Assert::IsTrue(element->getName().istGleich("xml"), L"Der Element Name ist falsch");
            Assert::IsTrue(element->getChildCount() == 2, L"Die Anzahl der Kinder ist falsch");
            Assert::IsTrue(element->zChild(0)->getAttributeCount() == 2, L"Die Anzahl der Attribute stimmt nicht");
            Assert::IsTrue(element->zChild(1)->getAttributeCount() == 0, L"Die Anzahl der Attribute stimmt nicht");
            Assert::IsTrue(element->zChild(0)->getName().istGleich("a1"), L"Der Element Name ist falsch");
            Assert::IsTrue(element->zChild(1)->getName().istGleich("a2"), L"Der Element Name ist falsch");
            Assert::IsTrue(element->zChild(0)->hasAttribute("x") == 0, L"Ein entferntes Attibut ist noch vorhanden");
            Assert::IsTrue(element->zChild(1)->hasAttribute("x") == 0, L"Ein entferntes Attibut ist noch vorhanden");
            element->release();
        }

        TEST_METHOD(AddChildrenTest)
        {
            Framework::XML::Element* element = new Framework::XML::Element("<xml><a1 x y z=\"\"/><a2/></xml>");
            element->selectChildren().whereAttributeExists("x").addChild(element->dublicate());
            Assert::IsTrue(element->getName().istGleich("xml"), L"Der Element Name ist falsch");
            Assert::IsTrue(element->getChildCount() == 2, L"Die Anzahl der Kinder ist falsch");
            Assert::IsTrue(element->zChild(0)->getAttributeCount() == 3, L"Die Anzahl der Attribute stimmt nicht");
            Assert::IsTrue(element->zChild(1)->getAttributeCount() == 0, L"Die Anzahl der Attribute stimmt nicht");
            Assert::IsTrue(element->zChild(0)->getName().istGleich("a1"), L"Der Element Name ist falsch");
            Assert::IsTrue(element->zChild(1)->getName().istGleich("a2"), L"Der Element Name ist falsch");
            Assert::IsTrue(element->zChild(0)->getChildCount() == 1, L"Anzahl der Kinder ist Falsch");
            Assert::IsTrue(element->zChild(1)->getChildCount() == 0, L"Anzahl der Kinder ist Falsch");
            element->release();
        }

        TEST_METHOD(RemoveTest)
        {
            Framework::XML::Element* element = new Framework::XML::Element("<xml><a1 x y z=\"\"/><a2/></xml>");
            element->selectChildren().whereAttributeExists("x").remove();
            Assert::IsTrue(element->getName().istGleich("xml"), L"Der Element Name ist falsch");
            Assert::IsTrue(element->getChildCount() == 1, L"Die Anzahl der Kinder ist falsch");
            Assert::IsTrue(element->zChild(0)->getAttributeCount() == 0, L"Die Anzahl der Attribute stimmt nicht");
            element->release();
        }
    };
}
