/*
 * Copyright (c) 2010 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/Serializer/PayloadSerializers/SearchPayloadSerializer.h>

using namespace Swift;

class SearchPayloadSerializerTest : public CppUnit::TestFixture {
		CPPUNIT_TEST_SUITE(SearchPayloadSerializerTest);
		CPPUNIT_TEST(testSerialize_Request);
		CPPUNIT_TEST(testSerialize_Items);
		CPPUNIT_TEST(testSerialize_DataForm);
		CPPUNIT_TEST_SUITE_END();

	public:
		void testSerialize_Request() {
			SearchPayloadSerializer testling;

			SearchPayload::ref payload(new SearchPayload());
			payload->setFirst("Juliet");
			payload->setLast("Capulet");

			CPPUNIT_ASSERT_EQUAL(std::string(
					"<query xmlns=\"jabber:iq:search\">"
						"<first>Juliet</first>"
						"<last>Capulet</last>"
					"</query>"
				), testling.serialize(payload));
		}

		void testSerialize_Items() {
			SearchPayloadSerializer testling;

			SearchPayload::ref payload(new SearchPayload());
			SearchPayload::Item item1;
			item1.jid = JID("juliet@capulet.com");
			item1.first = "Juliet";
			item1.last = "Capulet";
			item1.nick = "JuliC";
			item1.email = "juliet@shakespeare.lit";
			payload->addItem(item1);

			SearchPayload::Item item2;
			item2.jid = JID("tybalt@shakespeare.lit");
			item2.first = "Tybalt";
			item2.last = "Capulet";
			item2.nick = "ty";
			item2.email = "tybalt@shakespeare.lit";
			payload->addItem(item2);

			CPPUNIT_ASSERT_EQUAL(std::string(
					"<query xmlns=\"jabber:iq:search\">"
						"<item jid=\"juliet@capulet.com\">"
							"<first>Juliet</first>"
							"<last>Capulet</last>"
							"<nick>JuliC</nick>"
							"<email>juliet@shakespeare.lit</email>"
						"</item>"
						"<item jid=\"tybalt@shakespeare.lit\">"
							"<first>Tybalt</first>"
							"<last>Capulet</last>"
							"<nick>ty</nick>"
							"<email>tybalt@shakespeare.lit</email>"
						"</item>"
					"</query>"
				), testling.serialize(payload));
		}

		void testSerialize_DataForm() {
			SearchPayloadSerializer testling;

			SearchPayload::ref payload(new SearchPayload());
			boost::shared_ptr<Form> form(new Form(Form::ResultType));

			FormField::ref field = HiddenFormField::create("jabber:iq:search");
			field->setName("FORM_TYPE");
			form->addField(field);

			// reported fields
			field = TextSingleFormField::create();
			field->setName("first");
			field->setLabel("Given Name");
			form->addReportedField(field);

			field = TextSingleFormField::create();
			field->setName("last");
			field->setLabel("Family Name");
			form->addReportedField(field);

			field = JIDSingleFormField::create();
			field->setName("jid");
			field->setLabel("Jabber ID");
			form->addReportedField(field);

			field = ListSingleFormField::create();
			field->setName("x-gender");
			field->setLabel("Gender");
			form->addReportedField(field);

			Form::FormItem firstItem;
			field = TextSingleFormField::create("Benvolio");
			field->setName("first");
			firstItem.push_back(field);

			field = TextSingleFormField::create("Montague");
			field->setName("last");
			firstItem.push_back(field);

			field = TextSingleFormField::create("benvolio@montague.net");
			field->setName("jid");
			firstItem.push_back(field);

			field = ListSingleFormField::create("male");
			field->setName("x-gender");
			firstItem.push_back(field);

			Form::FormItem secondItem;
			field = TextSingleFormField::create("Romeo");
			field->setName("first");
			secondItem.push_back(field);

			field = TextSingleFormField::create("Montague");
			field->setName("last");
			secondItem.push_back(field);

			field = TextSingleFormField::create("romeo@montague.net");
			field->setName("jid");
			secondItem.push_back(field);

			field = ListSingleFormField::create("male");
			field->setName("x-gender");
			secondItem.push_back(field);

			form->addItem(firstItem);
			form->addItem(secondItem);

			payload->setForm(form);

			CPPUNIT_ASSERT_EQUAL(std::string(
				"<query xmlns=\"jabber:iq:search\">"
					"<x type=\"result\" xmlns=\"jabber:x:data\">"
						"<field type=\"hidden\" var=\"FORM_TYPE\">"
							"<value>jabber:iq:search</value>"
						"</field>"
						"<reported>"
							"<field label=\"Given Name\" type=\"text-single\" var=\"first\"/>"
							"<field label=\"Family Name\" type=\"text-single\" var=\"last\"/>"
							"<field label=\"Jabber ID\" type=\"jid-single\" var=\"jid\"/>"
							"<field label=\"Gender\" type=\"list-single\" var=\"x-gender\"/>"
						"</reported>"
						"<item>"
							"<field var=\"first\"><value>Benvolio</value></field>"
							"<field var=\"last\"><value>Montague</value></field>"
							"<field var=\"jid\"><value>benvolio@montague.net</value></field>"
							"<field var=\"x-gender\"><value>male</value></field>"
						"</item>"
						"<item>"
							"<field var=\"first\"><value>Romeo</value></field>"
							"<field var=\"last\"><value>Montague</value></field>"
							"<field var=\"jid\"><value>romeo@montague.net</value></field>"
							"<field var=\"x-gender\"><value>male</value></field>"
						"</item>"
					"</x>"
				"</query>"), testling.serialize(payload));

		}
};

CPPUNIT_TEST_SUITE_REGISTRATION(SearchPayloadSerializerTest);