[Libreoffice-commits] .: starmath/qa starmath/source

Jonas Finnemann Jensen jopsen at kemper.freedesktop.org
Sat Jan 29 07:41:06 PST 2011


 starmath/qa/cppunit/test_nodetotextvisitors.cxx |  167 +++++++++++++++++++++++-
 starmath/source/visitors.cxx                    |   24 ++-
 2 files changed, 181 insertions(+), 10 deletions(-)

New commits:
commit e3d58111a0a8feec2e0572c6ddf725e9359fde83
Author: Luke Dixon <6b8b4567 at gmail.com>
Date:   Sat Jan 29 12:32:53 2011 +0000

    Add some brackets back to SmNodeToTextVisitor
    
    For SmOperNodes, I shouldn't have removed these brackets.
    Add brackets around SmBinVerNodes and SmBinDiagonalNodes, removing the ones
    from SmBinHorNodes and SmUnHorNodes made these ones necessary.
    Add brackets when an SmExpressionNode has an SmBinHorNode child.

diff --git a/starmath/qa/cppunit/test_nodetotextvisitors.cxx b/starmath/qa/cppunit/test_nodetotextvisitors.cxx
index 687f75b..177bb82 100644
--- a/starmath/qa/cppunit/test_nodetotextvisitors.cxx
+++ b/starmath/qa/cppunit/test_nodetotextvisitors.cxx
@@ -93,6 +93,9 @@ namespace {
 
 class Test : public CppUnit::TestFixture {
 public:
+    Test();
+    ~Test();
+
     // init
     virtual void setUp();
     virtual void tearDown();
@@ -111,6 +114,9 @@ public:
     void SimpleGreekChars();
     void SimpleSpecialChars();
     void testBinomInBinHor();
+    void testBinVerInUnary();
+    void testBinHorInSubSup();
+    void testUnaryInMixedNumberAsNumerator();
 
     CPPUNIT_TEST_SUITE(Test);
     CPPUNIT_TEST(SimpleUnaryOp);
@@ -126,15 +132,19 @@ public:
     CPPUNIT_TEST(SimpleGreekChars);
     CPPUNIT_TEST(SimpleSpecialChars);
     CPPUNIT_TEST(testBinomInBinHor);
+    CPPUNIT_TEST(testBinVerInUnary);
+    CPPUNIT_TEST(testBinHorInSubSup);
+    CPPUNIT_TEST(testUnaryInMixedNumberAsNumerator);
     CPPUNIT_TEST_SUITE_END();
 
 private:
     uno::Reference< uno::XComponentContext > m_context;
     SmDocShellRef xDocShRef;
     void parseandparseagain(const char *input, const char *test_name);
+    void ParseAndCheck(const char *input, const char *expected, const char *test_name);
 };
 
-void Test::setUp()
+Test::Test()
 {
     m_context = cppu::defaultBootstrap_InitialComponentContext();
 
@@ -149,12 +159,20 @@ void Test::setUp()
     InitVCL(xSM);
 
     SmDLL::Init();
+}
 
+void Test::setUp()
+{
     xDocShRef = new SmDocShell(SFXOBJECTSHELL_STD_NORMAL);
 }
 
 void Test::tearDown()
 {
+    xDocShRef.Clear();
+}
+
+Test::~Test()
+{
 }
 
 /*
@@ -172,6 +190,17 @@ void Test::SimpleUnaryOp()
     parseandparseagain("+-3", "Plus/minus");
     parseandparseagain("-+4", "Minus/plus");
     parseandparseagain("neg a", "Boolean 'not'");
+    parseandparseagain("fact a", "Factorial");
+    parseandparseagain(" - { 1 over 2 } ", "BinVer in Unary 1");
+    ParseAndCheck(" - { 1 over 2 } ", " - { 1 over 2 } ", "BinVer in Unary 1");
+    parseandparseagain(" { - { 1 over 2 } } ", "BinVer in Unary 2");
+    parseandparseagain(" - 1 over 2 ", "Unary in BinVer as numerator 1");
+    parseandparseagain(" { - 1 } over 2 ", "Unary in BinVer as numerator 2");
+    parseandparseagain(" 1 over - 2 ", "Unary in BinVer as denominator 1");
+    parseandparseagain(" 1 over { - 2 } ", "Unary in BinVer as denominator 2");
+    parseandparseagain(" 2 { - 1 over 2 } ", "Mixed number with Unary in denominator 1");
+    parseandparseagain(" 2 { - 1 } over 2 ", "Mixed number with Unary in denominator 2");
+    parseandparseagain(" - 1 + 2 ", "Unary in BinHor");
 }
 
 void Test::SimpleBinaryOp()
@@ -266,7 +295,6 @@ void Test::SimpleFunctions()
     parseandparseagain("arcosh(a)", "Arc hyperbolic cosine");
     parseandparseagain("artanh(a)", "Arc hyperbolic tangent");
     parseandparseagain("arcoth(a)", "Arc hyperbolic cotangent");
-    parseandparseagain("fact a", "Factorial");
 }
 
 void Test::SimpleOperators()
@@ -275,7 +303,9 @@ void Test::SimpleOperators()
     parseandparseagain("sum{a}", "Sum");
     parseandparseagain("prod{a}", "Product");
     parseandparseagain("coprod{a}", "Coproduct");
-    parseandparseagain("int from {r_0} to {r_t} a", "Upper and lower bounds shown with integral");
+    parseandparseagain("int from {r_0} to {r_t} a", "Upper and lower bounds shown with integral (from & to)");
+    ParseAndCheck("int csup {r_0} csub {r_t} a", "int csup { r rsub 0 } csub { r rsub t } a ", "Upper and lower bounds shown with integral (csub & csup)");
+    ParseAndCheck("sum csup { size 8 { x - 1 } } csub { size 8 a } b ", "sum csup { size 8 { x - 1 } } csub { size 8 a } b ", "Sum with sized upper and lower bounds");
     parseandparseagain("int{a}", "Integral");
     parseandparseagain("iint{a}", "Double integral");
     parseandparseagain("iiint{a}", "Triple integral");
@@ -497,6 +527,26 @@ void Test::parseandparseagain(const char *formula, const char *test_name)
     delete pNode2;
 }
 
+void Test::ParseAndCheck(const char *formula, const char * expected, const char *test_name)
+{
+    String sInput, sOutput, sExpected;
+    SmNode *pNode;
+
+    // parse
+    sInput.AppendAscii(formula);
+    pNode = SmParser().ParseExpression(sInput);
+    pNode->Prepare(xDocShRef->GetFormat(), *xDocShRef);
+    SmNodeToTextVisitor(pNode, sOutput);
+
+    // compare
+    sExpected.AppendAscii(expected);
+    CPPUNIT_ASSERT_EQUAL_MESSAGE(test_name,
+        sExpected,
+        sOutput);
+
+    delete pNode;
+}
+
 void Test::testBinomInBinHor()
 {
     String sInput, sExpected, sOutput;
@@ -521,6 +571,117 @@ void Test::testBinomInBinHor()
 
     sExpected.AppendAscii(" { { binom a b + c } + d } ");
     CPPUNIT_ASSERT_EQUAL_MESSAGE("Binom Node in BinHor Node", sExpected, xDocShRef->GetText());
+
+    delete pTree;
+}
+
+void Test::testBinVerInUnary()
+{
+    String sInput, sExpected, sOutput;
+    SmNode* pTree;
+
+    // set up a unary operator with operand
+    sInput.AppendAscii("- 1");
+    pTree = SmParser().Parse(sInput);
+    pTree->Prepare(xDocShRef->GetFormat(), *xDocShRef);
+
+    SmCursor aCursor(pTree, xDocShRef);
+    TestOutputDevice aOutputDevice;
+
+    // move forward (more than) enough places to be at the end
+    int i;
+    for (i = 0; i < 3; ++i)
+        aCursor.Move(&aOutputDevice, MoveRight);
+
+    // select the operand
+    aCursor.Move(&aOutputDevice, MoveLeft, false);
+    // set up a fraction
+    aCursor.InsertFraction();
+    aCursor.Move(&aOutputDevice, MoveDown);
+    aCursor.InsertText('2');
+
+    sExpected.AppendAscii(" - { 1 over 2 } ");
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("Binary Vertical in Unary Operator", sExpected, xDocShRef->GetText());
+
+    delete pTree;
+}
+
+void Test::testBinHorInSubSup()
+{
+    String sInput, sExpected, sOutput;
+    SmNode* pTree;
+
+    // set up a blank formula
+    sInput.AppendAscii("");
+    pTree = SmParser().Parse(sInput);
+    pTree->Prepare(xDocShRef->GetFormat(), *xDocShRef);
+
+    SmCursor aCursor(pTree, xDocShRef);
+    TestOutputDevice aOutputDevice;
+
+    // Insert an RSup expression with a BinHor for the exponent
+    aCursor.InsertText('a');
+    aCursor.InsertSubSup(RSUP);
+    aCursor.InsertText('b');
+    aCursor.InsertElement(PlusElement);
+    aCursor.InsertText('c');
+
+    // Move to the end and add d to the expression
+    aCursor.Move(&aOutputDevice, MoveRight);
+    aCursor.InsertElement(PlusElement);
+    aCursor.InsertText('d');
+
+    sExpected.AppendAscii(" { a rsup { b + c } + d } ");
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("BinHor in SubSup", sExpected, xDocShRef->GetText());
+
+    delete pTree;
+}
+
+void Test::testUnaryInMixedNumberAsNumerator()
+{
+    String sInput, sExpected, sOutput;
+    SmNode* pTree;
+
+    // set up a unary operator
+    sInput.AppendAscii("- 1");
+    pTree = SmParser().Parse(sInput);
+    pTree->Prepare(xDocShRef->GetFormat(), *xDocShRef);
+
+    SmCursor aCursor(pTree, xDocShRef);
+    TestOutputDevice aOutputDevice;
+
+    // move forward (more than) enough places to be at the end
+    int i;
+    for (i = 0; i < 3; ++i)
+        aCursor.Move(&aOutputDevice, MoveRight);
+
+    // Select the whole Unary Horizontal Node
+    aCursor.Move(&aOutputDevice, MoveLeft, false);
+    aCursor.Move(&aOutputDevice, MoveLeft, false);
+
+    // Set up a fraction
+    aCursor.InsertFraction();
+    aCursor.Move(&aOutputDevice, MoveDown);
+    aCursor.InsertText('2');
+
+    // Move left and turn this into a mixed number
+    // (bad form, but this could happen right?)
+    aCursor.Move(&aOutputDevice, MoveLeft);
+    aCursor.Move(&aOutputDevice, MoveLeft);
+    aCursor.InsertText('2');
+
+    // move forward (more than) enough places to be at the end
+    for (i = 0; i < 8; ++i)
+        aCursor.Move(&aOutputDevice, MoveRight);
+
+    // add 4 to the end
+    aCursor.InsertElement(PlusElement);
+    aCursor.InsertText('4');
+
+    sExpected.AppendAscii(" { 2 { - 1 over 2 } + 4 } ");
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("Unary in mixed number as Numerator", sExpected, xDocShRef->GetText());
+
+    delete pTree;
 }
 
 CPPUNIT_TEST_SUITE_REGISTRATION(Test);
diff --git a/starmath/source/visitors.cxx b/starmath/source/visitors.cxx
index 6ce8112..9d0a8c5 100644
--- a/starmath/source/visitors.cxx
+++ b/starmath/source/visitors.cxx
@@ -2244,33 +2244,39 @@ void SmNodeToTextVisitor::Visit( SmOperNode* pNode )
         SmNode* pChild;
         if( ( pChild = pSubSup->GetSubSup( LSUP ) ) ) {
             Separate( );
-            Append( "lsup " );
+            Append( "lsup { " );
             LineToText( pChild );
+            Append( "} " );
         }
         if( ( pChild = pSubSup->GetSubSup( LSUB ) ) ) {
             Separate( );
-            Append( "lsub " );
+            Append( "lsub { " );
             LineToText( pChild );
+            Append( "} " );
         }
         if( ( pChild = pSubSup->GetSubSup( RSUP ) ) ) {
             Separate( );
-            Append( "rsup " );
+            Append( "rsup { " );
             LineToText( pChild );
+            Append( "} " );
         }
         if( ( pChild = pSubSup->GetSubSup( RSUB ) ) ) {
             Separate( );
-            Append( "rsub " );
+            Append( "rsub { " );
             LineToText( pChild );
+            Append( "} " );
         }
         if( ( pChild = pSubSup->GetSubSup( CSUP ) ) ) {
             Separate( );
-            Append( "csup " );
+            Append( "csup { " );
             LineToText( pChild );
+            Append( "} " );
         }
         if( ( pChild = pSubSup->GetSubSup( CSUB ) ) ) {
             Separate( );
-            Append( "csub " );
+            Append( "csub { " );
             LineToText( pChild );
+            Append( "} " );
         }
     }
     LineToText( pNode->GetSubNode( 1 ) );
@@ -2401,19 +2407,23 @@ void SmNodeToTextVisitor::Visit( SmBinVerNode* pNode )
 {
     SmNode *pNum    = pNode->GetSubNode( 0 ),
            *pDenom  = pNode->GetSubNode( 2 );
+    Append( "{ " );
     LineToText( pNum );
     Append( "over" );
     LineToText( pDenom );
+    Append( "} " );
 }
 
 void SmNodeToTextVisitor::Visit( SmBinDiagonalNode* pNode )
 {
     SmNode *pLeftOperand  = pNode->GetSubNode( 0 ),
            *pRightOperand = pNode->GetSubNode( 1 );
+    Append( "{ " );
     LineToText( pLeftOperand );
     Separate( );
     Append( "wideslash " );
     LineToText( pRightOperand );
+    Append( "} " );
 }
 
 void SmNodeToTextVisitor::Visit( SmSubSupNode* pNode )
@@ -2525,7 +2535,7 @@ void SmNodeToTextVisitor::Visit( SmLineNode* pNode )
 
 void SmNodeToTextVisitor::Visit( SmExpressionNode* pNode )
 {
-    bool bracketsNeeded = pNode->GetNumSubNodes() != 1 || pNode->GetSubNode(0)->GetType() != NEXPRESSION;
+    bool bracketsNeeded = pNode->GetNumSubNodes() != 1 || pNode->GetSubNode(0)->GetType() == NBINHOR;
     if (bracketsNeeded) {
         Append( "{ " );
     }


More information about the Libreoffice-commits mailing list