/* ====================================================================
 * Copyright (c) 2003-2006, Martin Hauner
 *                          http://subcommander.tigris.org
 *
 * Subcommander is licensed as described in the file doc/COPYING, which
 * you should have received as part of this distribution.
 * ====================================================================
 */

#include "TextModelTestRemove.h"

// cppunit
#include <cppunit/TestSuite.h>
#include <cppunit/TestCaller.h>

// sc
#include "sublib/TextModelImpl.h"
#include "sublib/Cursor.h"
#include "sublib/Line.h"
#include "util/String.h"


TextModelTestRemove::TextModelTestRemove() : CppUnit::TestCase("TextModelTestRemove")
{
}

TextModelTestRemove::~TextModelTestRemove()
{
}

void TextModelTestRemove::setUp()
{
  sc::String text( "test" );
  TextModelImpl* impl1 = new TextModelImpl( text );
  TextModelImpl* impl2 = new TextModelImpl( text );

  impl1->addLine( Line(sc::String("line1\x0a"),0,ctCommon) );
  impl1->addLine( Line(sc::String("line2\x0a"),0,ctCommon) );

  impl2->addLine( Line(sc::String("line1\x0d\x0a"),0,ctCommon) );
  impl2->addLine( Line(sc::String("line2\x0d\x0a"),0,ctCommon) );

  _text1 = impl1;
  _text2 = impl2;
}

void TextModelTestRemove::tearDown()
{
  delete _text1;
  delete _text2;
}


CppUnit::Test *TextModelTestRemove::suite()
{
  CppUnit::TestSuite *newSuite = new CppUnit::TestSuite("TextModelTestRemove");

  newSuite->addTest(new CppUnit::TestCaller<TextModelTestRemove>("testRemoveLeft",&TextModelTestRemove::testRemoveLeft) );
  newSuite->addTest(new CppUnit::TestCaller<TextModelTestRemove>("testRemoveRight",&TextModelTestRemove::testRemoveRight) );

  newSuite->addTest(new CppUnit::TestCaller<TextModelTestRemove>("testRemoveLeftLineEnd",&TextModelTestRemove::testRemoveLeftLineEnd) );

  return newSuite;
}

void TextModelTestRemove::testRemoveLeft()
{
  Cursor posBefore(0,3);
  Cursor posAfter(0,2);
  _text1->setCursor( posBefore );
  _text1->setCursor2( posBefore );

  _text1->removeTextLeft();

  {
    Cursor c1 = _text1->getCursor();
    Cursor c2 = _text1->getCursor2();
    CPPUNIT_ASSERT( c1.equalPos(posAfter) );
    CPPUNIT_ASSERT( c2.equalPos(posAfter) );
  }
  {
    const Line& res = _text1->getLine(0);
    CPPUNIT_ASSERT_EQUAL( sc::String("lie1\x0a"), res.getLine() );
  }

  _text1->undo();

  {
    Cursor c1 = _text1->getCursor();
    Cursor c2 = _text1->getCursor2();
    CPPUNIT_ASSERT( c1.equalPos(posBefore) );
    CPPUNIT_ASSERT( c2.equalPos(posBefore) );
  }
  {
    const Line& res = _text1->getLine(0);
    CPPUNIT_ASSERT_EQUAL( sc::String("line1\x0a"), res.getLine() );
  }
}


void TextModelTestRemove::testRemoveRight()
{
  Cursor posBefore(0,3);
  Cursor posAfter(0,3);
  _text1->setCursor( posBefore );
  _text1->setCursor2( posBefore );

  _text1->removeTextRight();

  {
    Cursor c1 = _text1->getCursor();
    Cursor c2 = _text1->getCursor2();
    CPPUNIT_ASSERT( c1.equalPos(posAfter) );
    CPPUNIT_ASSERT( c2.equalPos(posAfter) );
  }
  {
    const Line& res = _text1->getLine(0);
    CPPUNIT_ASSERT_EQUAL( sc::String("lin1\x0a"), res.getLine() );
  }

  _text1->undo();

  {
    Cursor c1 = _text1->getCursor();
    Cursor c2 = _text1->getCursor2();
    CPPUNIT_ASSERT( c1.equalPos(posBefore) );
    CPPUNIT_ASSERT( c2.equalPos(posBefore) );
  }
  {
    const Line& res = _text1->getLine(0);
    CPPUNIT_ASSERT_EQUAL( sc::String("line1\x0a"), res.getLine() );
  }
}


void TextModelTestRemove::testRemoveLeftLineEnd()
{
  Cursor posBefore(1,0);
  Cursor posAfter(0,5);
  _text1->setCursor( posBefore );
  _text1->setCursor2( posBefore );

  _text1->removeTextLeft();

  {
    Cursor c1 = _text1->getCursor();
    Cursor c2 = _text1->getCursor2();
    CPPUNIT_ASSERT( c1.equalPos(posAfter) );
    CPPUNIT_ASSERT( c2.equalPos(posAfter) );
  }
  {
    CPPUNIT_ASSERT( 1 == _text1->getLineCnt() );

    const Line& res = _text1->getLine(0);
    CPPUNIT_ASSERT_EQUAL( sc::String("line1line2\x0a"), res.getLine() );

    const Line& res2 = _text1->getLine(1);
    CPPUNIT_ASSERT_EQUAL( Line::getEmpty().getLine(), res2.getLine() );
  }

  _text1->undo();

  {
    Cursor c1 = _text1->getCursor();
    Cursor c2 = _text1->getCursor2();
    CPPUNIT_ASSERT( c1.equalPos(posBefore) );
    CPPUNIT_ASSERT( c2.equalPos(posBefore) );
  }
  {
    CPPUNIT_ASSERT( 2 == _text1->getLineCnt() );

    const Line& res = _text1->getLine(0);
    CPPUNIT_ASSERT_EQUAL( sc::String("line1\x0a"), res.getLine() );

    const Line& res2 = _text1->getLine(1);
    CPPUNIT_ASSERT_EQUAL( sc::String("line2\x0a"), res2.getLine() );
  }
}



syntax highlighted by Code2HTML, v. 0.9.1