/*
 * Copyright (c) 2011 Remko Tronçon
 * Licensed under the GNU General Public License v3.
 * See Documentation/Licenses/GPLv3.txt for more information.
 */

#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/extensions/TestFactoryRegistry.h>

#include <Swiften/Parser/PlatformXMLParserFactory.h>
#include <Swiften/Parser/BOSHBodyExtractor.h>

using namespace Swift;

class BOSHBodyExtractorTest : public CppUnit::TestFixture {
		CPPUNIT_TEST_SUITE(BOSHBodyExtractorTest);
		CPPUNIT_TEST(testGetBody);
		CPPUNIT_TEST(testGetBody_EmptyContent);
		CPPUNIT_TEST(testGetBody_EmptyContent2);
		CPPUNIT_TEST(testGetBody_EmptyElementEmptyContent);
		CPPUNIT_TEST(testGetBody_InvalidStartTag);
		CPPUNIT_TEST(testGetBody_InvalidStartTag2);
		CPPUNIT_TEST(testGetBody_IncompleteStartTag);
		CPPUNIT_TEST(testGetBody_InvalidEndTag);
		CPPUNIT_TEST(testGetBody_InvalidEndTag2);
		CPPUNIT_TEST_SUITE_END();

	public:
		void testGetBody() {
			BOSHBodyExtractor testling(&parserFactory, createByteArray(
					"<body a1='a\"1' a2=\"a'2\" boo='bar'   >"
						"foo <message> <body> bar"
					"</body   >  "));

			CPPUNIT_ASSERT(testling.getBody());
			CPPUNIT_ASSERT_EQUAL(std::string("a\"1"), testling.getBody()->attributes.getAttribute("a1"));
			CPPUNIT_ASSERT_EQUAL(std::string("foo <message> <body> bar"), testling.getBody()->content);
		}

		void testGetBody_EmptyContent() {
			BOSHBodyExtractor testling(&parserFactory, createByteArray(
					"<body foo='bar'/>"));

			CPPUNIT_ASSERT(testling.getBody());
			CPPUNIT_ASSERT_EQUAL(std::string("bar"), testling.getBody()->attributes.getAttribute("foo"));
			CPPUNIT_ASSERT(testling.getBody()->content.empty());
		}

		void testGetBody_EmptyContent2() {
			BOSHBodyExtractor testling(&parserFactory, createByteArray(
					"<body foo='bar'></body>"));

			CPPUNIT_ASSERT(testling.getBody());
			CPPUNIT_ASSERT_EQUAL(std::string("bar"), testling.getBody()->attributes.getAttribute("foo"));
			CPPUNIT_ASSERT(testling.getBody()->content.empty());
		}

		void testGetBody_EmptyElementEmptyContent() {
			BOSHBodyExtractor testling(&parserFactory, createByteArray(
					"<body/>"));

			CPPUNIT_ASSERT(testling.getBody());
		}

		void testGetBody_InvalidStartTag() {
			BOSHBodyExtractor testling(&parserFactory, createByteArray(
					"<bodi></body>"));

			CPPUNIT_ASSERT(!testling.getBody());
		}

		void testGetBody_InvalidStartTag2() {
			BOSHBodyExtractor testling(&parserFactory, createByteArray(
					"<bodyy></body>"));

			CPPUNIT_ASSERT(!testling.getBody());
		}

		void testGetBody_IncompleteStartTag() {
			BOSHBodyExtractor testling(&parserFactory, createByteArray(
					"<body"));

			CPPUNIT_ASSERT(!testling.getBody());
		}

		void testGetBody_InvalidEndTag() {
			BOSHBodyExtractor testling(&parserFactory, createByteArray(
					"<body></bodi>"));

			CPPUNIT_ASSERT(!testling.getBody());
		}

		void testGetBody_InvalidEndTag2() {
			BOSHBodyExtractor testling(&parserFactory, createByteArray(
					"<body><b/body>"));

			CPPUNIT_ASSERT(!testling.getBody());
		}

	private:
		PlatformXMLParserFactory parserFactory;
};

CPPUNIT_TEST_SUITE_REGISTRATION(BOSHBodyExtractorTest);