From b4470a58d2f2f50e40eedd0a72a5c36fdcb79ae1 Mon Sep 17 00:00:00 2001 From: Mateusz Piekos Date: Mon, 9 Jul 2012 12:15:06 +0200 Subject: Added more complicated WhiteboardClient test and updated this class to pass it diff --git a/Swiften/Whiteboard/UnitTest/WhiteboardClientTest.cpp b/Swiften/Whiteboard/UnitTest/WhiteboardClientTest.cpp index f6f8249..32e6cc3 100644 --- a/Swiften/Whiteboard/UnitTest/WhiteboardClientTest.cpp +++ b/Swiften/Whiteboard/UnitTest/WhiteboardClientTest.cpp @@ -18,6 +18,7 @@ using namespace Swift; class WhiteboardClientTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(WhiteboardClientTest); CPPUNIT_TEST(testNoninterrupedSynchronization); + CPPUNIT_TEST(testInterrupedSynchronization); CPPUNIT_TEST_SUITE_END(); public: void testNoninterrupedSynchronization() { @@ -90,6 +91,94 @@ public: CPPUNIT_ASSERT_EQUAL(WhiteboardOperation::ref(), pairResult.second); } + void testInterrupedSynchronization() { + WhiteboardClient client; + WhiteboardInsertOperation::ref serverOp; + serverOp = createInsertOperation("0", ""); + serverOp->setPos(0); + std::pair pairResult = client.handleServerOperationReceived(serverOp); + CPPUNIT_ASSERT_EQUAL(serverOp, boost::dynamic_pointer_cast(pairResult.first)); + CPPUNIT_ASSERT_EQUAL(WhiteboardOperation::ref(), pairResult.second); + + WhiteboardInsertOperation::ref clientOp; + clientOp = createInsertOperation("a", "0"); + clientOp->setPos(1); + clientOp->setOrigin(WhiteboardOperation::Local); + WhiteboardEllipseElement::ref aElement = boost::make_shared(0,0,0,0); + clientOp->setElement(aElement); + WhiteboardInsertOperation::ref result = boost::dynamic_pointer_cast(client.handleLocalOperationReceived(clientOp)); + CPPUNIT_ASSERT_EQUAL(clientOp, boost::dynamic_pointer_cast(result)); + CPPUNIT_ASSERT_EQUAL(aElement, boost::dynamic_pointer_cast(result->getElement())); + + + clientOp = createInsertOperation("b", "a"); + clientOp->setPos(2); + clientOp->setOrigin(WhiteboardOperation::Local); + WhiteboardEllipseElement::ref bElement = boost::make_shared(0,0,0,0); + clientOp->setElement(bElement); + CPPUNIT_ASSERT_EQUAL(WhiteboardOperation::ref(), client.handleLocalOperationReceived(clientOp)); + + serverOp = createInsertOperation("c", "0"); + serverOp->setPos(1); + serverOp->setOrigin(WhiteboardOperation::Other); + WhiteboardEllipseElement::ref cElement = boost::make_shared(0,0,0,0); + serverOp->setElement(cElement); + pairResult = client.handleServerOperationReceived(serverOp); + result = boost::dynamic_pointer_cast(pairResult.first); + CPPUNIT_ASSERT_EQUAL(3, result->getPos()); + CPPUNIT_ASSERT_EQUAL(cElement, boost::dynamic_pointer_cast(result->getElement())); + CPPUNIT_ASSERT_EQUAL(std::string("b"), result->getParentID()); + CPPUNIT_ASSERT_EQUAL(WhiteboardOperation::ref(), pairResult.second); + + clientOp = createInsertOperation("e", "a"); + clientOp->setPos(4); + clientOp->setOrigin(WhiteboardOperation::Local); + WhiteboardEllipseElement::ref eElement = boost::make_shared(0,0,0,0); + clientOp->setElement(eElement); + CPPUNIT_ASSERT_EQUAL(WhiteboardOperation::ref(), client.handleLocalOperationReceived(clientOp)); + + serverOp = createInsertOperation("d", "c"); + serverOp->setPos(2); + serverOp->setOrigin(WhiteboardOperation::Other); + WhiteboardEllipseElement::ref dElement = boost::make_shared(0,0,0,0); + serverOp->setElement(dElement); + pairResult = client.handleServerOperationReceived(serverOp); + result = boost::dynamic_pointer_cast(pairResult.first); + CPPUNIT_ASSERT_EQUAL(5, result->getPos()); + CPPUNIT_ASSERT_EQUAL(dElement, boost::dynamic_pointer_cast(result->getElement())); + CPPUNIT_ASSERT_EQUAL(std::string("e"), result->getParentID()); + CPPUNIT_ASSERT_EQUAL(WhiteboardOperation::ref(), pairResult.second); + + serverOp = createInsertOperation("a", "d"); + serverOp->setPos(1); + serverOp->setOrigin(WhiteboardOperation::Other); + pairResult = client.handleServerOperationReceived(serverOp); + result = boost::dynamic_pointer_cast(pairResult.second); + CPPUNIT_ASSERT_EQUAL(WhiteboardOperation::ref(), pairResult.first); + CPPUNIT_ASSERT_EQUAL(std::string("b"), result->getID()); + CPPUNIT_ASSERT_EQUAL(bElement, boost::dynamic_pointer_cast(result->getElement())); + CPPUNIT_ASSERT_EQUAL(std::string("a"), result->getParentID()); + CPPUNIT_ASSERT_EQUAL(WhiteboardOperation::Other, result->getOrigin()); + + serverOp = createInsertOperation("b", "a"); + serverOp->setPos(2); + serverOp->setOrigin(WhiteboardOperation::Other); + pairResult = client.handleServerOperationReceived(serverOp); + result = boost::dynamic_pointer_cast(pairResult.second); + CPPUNIT_ASSERT_EQUAL(WhiteboardOperation::ref(), pairResult.first); + CPPUNIT_ASSERT_EQUAL(std::string("e"), result->getID()); + CPPUNIT_ASSERT_EQUAL(eElement, boost::dynamic_pointer_cast(result->getElement())); + CPPUNIT_ASSERT_EQUAL(std::string("b"), result->getParentID()); + CPPUNIT_ASSERT_EQUAL(WhiteboardOperation::Other, result->getOrigin()); + + serverOp = createInsertOperation("e", "b"); + serverOp->setPos(4); + serverOp->setOrigin(WhiteboardOperation::Other); + pairResult = client.handleServerOperationReceived(serverOp); + CPPUNIT_ASSERT_EQUAL(WhiteboardOperation::ref(), pairResult.first); + CPPUNIT_ASSERT_EQUAL(WhiteboardOperation::ref(), pairResult.second); + } + WhiteboardInsertOperation::ref createInsertOperation(std::string id, std::string parent) { WhiteboardInsertOperation::ref operation = boost::make_shared(); operation->setParentID(parent); diff --git a/Swiften/Whiteboard/WhiteboardClient.cpp b/Swiften/Whiteboard/WhiteboardClient.cpp index 6b352f5..cc41e85 100644 --- a/Swiften/Whiteboard/WhiteboardClient.cpp +++ b/Swiften/Whiteboard/WhiteboardClient.cpp @@ -6,10 +6,16 @@ #include #include +#include namespace Swift { WhiteboardOperation::ref WhiteboardClient::handleLocalOperationReceived(WhiteboardOperation::ref operation) { localOperations_.push_back(operation); + if (bridge_.size() > 0) { + WhiteboardOperation::ref op = boost::make_shared(*boost::dynamic_pointer_cast(operation).get()); + op->setParentID(bridge_.back()->getID()); + bridge_.push_back(op); + } if (lastSentOperationID_.empty()) { lastSentOperationID_ = operation->getID(); @@ -54,6 +60,7 @@ namespace Swift { (*it)->setParentID(previousID); previousID = (*it)->getID(); } + temp->setParentID(localOperations_.back()->getID()); localOperations_.push_back(temp); clientOp = temp; -- cgit v0.10.2-6-g49f6