/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */
 
#include <sal/config.h>
#include <test/unoapi_test.hxx>
 
#include <sfx2/sfxbasemodel.hxx>
 
#include <document.hxx>
#include <smdll.hxx>
 
using namespace ::com::sun::star;
 
class Test : public UnoApiTest
{
public:
    Test()
        : UnoApiTest(u"starmath/qa/extras/data/"_ustr)
    {
    }
 
    void testColor();
    void testSimple();
    void testNsPrefixMath();
    void testMaction();
    void testMspace();
    void testtdf99556();
    void testTdf103430();
    void testTdf103500();
    void testTdf137008();
    void testTdf151842();
    void testMathmlEntities();
    void testMaj();
    void testHadd();
 
    CPPUNIT_TEST_SUITE(Test);
    CPPUNIT_TEST(testColor);
    CPPUNIT_TEST(testSimple);
    CPPUNIT_TEST(testNsPrefixMath);
    CPPUNIT_TEST(testMaction);
    CPPUNIT_TEST(testMspace);
    CPPUNIT_TEST(testtdf99556);
    CPPUNIT_TEST(testTdf103430);
    CPPUNIT_TEST(testTdf103500);
    CPPUNIT_TEST(testTdf137008);
    CPPUNIT_TEST(testTdf151842);
    CPPUNIT_TEST(testMathmlEntities);
    CPPUNIT_TEST(testMaj);
    CPPUNIT_TEST(testHadd);
    CPPUNIT_TEST_SUITE_END();
};
 
void Test::testColor()
{
    loadFromFile(u"color.mml");
    SfxBaseModel* pModel = dynamic_cast<SfxBaseModel*>(mxComponent.get());
    SmDocShell* pDocShell = static_cast<SmDocShell*>(pModel->GetObjectShell());
    CPPUNIT_ASSERT_EQUAL(u"{ color black b"
                         " color white w"
                         " color red r"
                         " color green g"
                         " color blue b"
                         " color yellow y"
                         " color silver s"
                         " color gray g"
                         " color maroon m"
                         " color purple p"
                         " color lime l"
                         " color olive o"
                         " color navy n"
                         " color teal t"
                         " color aqua a"
                         " color fuchsia f"
                         " color crimson c"
                         " color dvip apricot"
                         " a color yellow y"
                         " color rgb 220 20 61 x }"_ustr,
                         pDocShell->GetText());
}
 
void Test::testSimple()
{
    loadFromFile(u"simple.mml");
    SfxBaseModel* pModel = dynamic_cast<SfxBaseModel*>(mxComponent.get());
    SmDocShell* pDocShell = static_cast<SmDocShell*>(pModel->GetObjectShell());
    CPPUNIT_ASSERT_EQUAL_MESSAGE("loaded text", u"left ( { a + b } right ) ^ 2"_ustr,
                                 pDocShell->GetText());
}
 
void Test::testNsPrefixMath()
{
    loadFromFile(u"ns-prefix-math.mml");
    SfxBaseModel* pModel = dynamic_cast<SfxBaseModel*>(mxComponent.get());
    SmDocShell* pDocShell = static_cast<SmDocShell*>(pModel->GetObjectShell());
    CPPUNIT_ASSERT_EQUAL_MESSAGE("loaded text", u"left ( { a + b } right ) ^ 2"_ustr,
                                 pDocShell->GetText());
}
 
void Test::testMaction()
{
    loadFromFile(u"maction.mml");
    SfxBaseModel* pModel = dynamic_cast<SfxBaseModel*>(mxComponent.get());
    SmDocShell* pDocShell = static_cast<SmDocShell*>(pModel->GetObjectShell());
    CPPUNIT_ASSERT_EQUAL_MESSAGE("loaded text", u"matrix{ 1 ## 2 ## 3 }"_ustr,
                                 pDocShell->GetText());
}
 
void Test::testMspace()
{
    loadFromFile(u"mspace.mml");
    SfxBaseModel* pModel = dynamic_cast<SfxBaseModel*>(mxComponent.get());
    SmDocShell* pDocShell = static_cast<SmDocShell*>(pModel->GetObjectShell());
    CPPUNIT_ASSERT_EQUAL(u"{ a b ~ c ~~``` d }"_ustr, pDocShell->GetText());
}
 
void Test::testtdf99556()
{
    loadFromFile(u"tdf99556-1.mml");
    SfxBaseModel* pModel = dynamic_cast<SfxBaseModel*>(mxComponent.get());
    SmDocShell* pDocShell = static_cast<SmDocShell*>(pModel->GetObjectShell());
    CPPUNIT_ASSERT_EQUAL_MESSAGE("loaded text", u"sqrt { }"_ustr, pDocShell->GetText());
}
 
void Test::testTdf103430()
{
    loadFromFile(u"tdf103430.mml");
    SfxBaseModel* pModel = dynamic_cast<SfxBaseModel*>(mxComponent.get());
    SmDocShell* pDocShell = static_cast<SmDocShell*>(pModel->GetObjectShell());
    CPPUNIT_ASSERT_EQUAL(u"{ frac { { nitalic d ^ 2 nitalic color blue y } } { { color dvip "
                         "apricot nitalic d font sans bold italic color red x } } }"_ustr,
                         pDocShell->GetText());
}
 
void Test::testTdf103500()
{
    loadFromFile(u"tdf103500.mml");
    SfxBaseModel* pModel = dynamic_cast<SfxBaseModel*>(mxComponent.get());
    SmDocShell* pDocShell = static_cast<SmDocShell*>(pModel->GetObjectShell());
    CPPUNIT_ASSERT_EQUAL(u"{ { int csup b csub a { { frac { 1 } { x } } ` nitalic d x } } = { "
                         "intd csup b csub a { { frac { 1 } { y } } ` nitalic d y } } }"_ustr,
                         pDocShell->GetText());
}
 
void Test::testTdf137008()
{
    // Without the fix in place, this test would have crashed
    loadFromFile(u"tdf137008.mml");
    SfxBaseModel* pModel = dynamic_cast<SfxBaseModel*>(mxComponent.get());
    SmDocShell* pDocShell = static_cast<SmDocShell*>(pModel->GetObjectShell());
    CPPUNIT_ASSERT_EQUAL(u"matrix{ { } # ## # }"_ustr, pDocShell->GetText());
}
 
void Test::testTdf151842()
{
    // Without the fix in place, this test would have crashed
    loadFromFile(u"tdf151842.odf");
    SfxBaseModel* pModel = dynamic_cast<SfxBaseModel*>(mxComponent.get());
    SmDocShell* pDocShell = static_cast<SmDocShell*>(pModel->GetObjectShell());
    CPPUNIT_ASSERT_EQUAL(u"test"_ustr, pDocShell->GetText());
    SmFormat aFormat = pDocShell->GetFormat();
 
    // Without the fix in place, this test would have failed with
    // - Expected: 2400
    // - Actual  : 423
    CPPUNIT_ASSERT_EQUAL(tools::Long(2400), aFormat.GetBaseSize().Height());
}
 
void Test::testMathmlEntities()
{
    loadFromFile(u"mthmlentities.mml");
    SfxBaseModel* pModel = dynamic_cast<SfxBaseModel*>(mxComponent.get());
    SmDocShell* pDocShell = static_cast<SmDocShell*>(pModel->GetObjectShell());
    CPPUNIT_ASSERT_EQUAL(u"{ \u03C3 \u221E \u221E \u03C3 }"_ustr, pDocShell->GetText());
}
 
void Test::testMaj()
{
    loadFromFile(u"maj.mml");
    SfxBaseModel* pModel = dynamic_cast<SfxBaseModel*>(mxComponent.get());
    CPPUNIT_ASSERT(pModel);
    SmDocShell* pDocShell = static_cast<SmDocShell*>(pModel->GetObjectShell());
    CPPUNIT_ASSERT(pDocShell);
    CPPUNIT_ASSERT_EQUAL(u"{ maj csup \u0661 csub { nitalic \U0001EE0A = \u0660 } { frac "
                         u"{ \u0661 } { nitalic \U0001EE0A } } }"_ustr,
                         pDocShell->GetText());
}
 
void Test::testHadd()
{
    loadFromFile(u"hadd.mml");
    SfxBaseModel* pModel = dynamic_cast<SfxBaseModel*>(mxComponent.get());
    CPPUNIT_ASSERT(pModel);
    SmDocShell* pDocShell = static_cast<SmDocShell*>(pModel->GetObjectShell());
    CPPUNIT_ASSERT(pDocShell);
    CPPUNIT_ASSERT_EQUAL(u"{ nitalic \U0001EEF1 csup nitalic \U0001EE4E csub nitalic "
                         u"\U0001EE4E nitalic \U0001EE4E }"_ustr,
                         pDocShell->GetText());
}
 
CPPUNIT_TEST_SUITE_REGISTRATION(Test);
 
CPPUNIT_PLUGIN_IMPLEMENT();
 
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

V530 The return value of function 'loadFromFile' is required to be utilized.

V530 The return value of function 'loadFromFile' is required to be utilized.

V530 The return value of function 'loadFromFile' is required to be utilized.

V530 The return value of function 'loadFromFile' is required to be utilized.

V530 The return value of function 'loadFromFile' is required to be utilized.

V530 The return value of function 'loadFromFile' is required to be utilized.

V530 The return value of function 'loadFromFile' is required to be utilized.

V530 The return value of function 'loadFromFile' is required to be utilized.

V530 The return value of function 'loadFromFile' is required to be utilized.

V530 The return value of function 'loadFromFile' is required to be utilized.

V530 The return value of function 'loadFromFile' is required to be utilized.

V530 The return value of function 'loadFromFile' is required to be utilized.

V530 The return value of function 'loadFromFile' is required to be utilized.