/* -*- 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"basictest.hxx"
namespace
{ usingnamespace com::sun::star; class Nested_Struct : public test::BootstrapFixture
{ public:
Nested_Struct(): BootstrapFixture(true, false) {}; void testAssign1(); void testAssign1Alt(); // result is uno-ised and tested void testOldAssign(); void testOldAssignAlt(); // result is uno-ised and tested void testUnfixedVarAssign(); void testUnfixedVarAssignAlt(); // result is uno-ised and tested void testFixedVarAssign(); void testFixedVarAssignAlt(); // result is uno-ised and tested void testUnoAccess(); // fdo#60117 specific test void testTdf134576();
// Adds code needed to register the test suite
CPPUNIT_TEST_SUITE(Nested_Struct);
// Declares the method as a test to call
CPPUNIT_TEST(testAssign1);
CPPUNIT_TEST(testAssign1Alt);
CPPUNIT_TEST(testOldAssign);
CPPUNIT_TEST(testOldAssignAlt);
CPPUNIT_TEST(testUnfixedVarAssign);
CPPUNIT_TEST(testUnfixedVarAssignAlt);
CPPUNIT_TEST(testFixedVarAssign);
CPPUNIT_TEST(testFixedVarAssignAlt);
CPPUNIT_TEST(testUnoAccess);
CPPUNIT_TEST(testTdf134576);
// End of test suite definition
CPPUNIT_TEST_SUITE_END();
};
// tests the new behaviour, we should be able to // directly modify the value of the nested 'HorizontalLine' struct
OUString sTestSource1(
u"Function doUnitTest() as Integer\n" "Dim b0 as new \"com.sun.star.table.TableBorder\"\n" "b0.HorizontalLine.OuterLineWidth = 9\n" "doUnitTest = b0.HorizontalLine.OuterLineWidth\n" "End Function\n"_ustr
);
OUString sTestSource1Alt(
u"Function doUnitTest() as Object\n" "Dim b0 as new \"com.sun.star.table.TableBorder\"\n" "b0.HorizontalLine.OuterLineWidth = 9\n" "doUnitTest = b0\n" "End Function\n"_ustr
);
// tests the old behaviour, we should still be able // to use the old workaround of // a) creating a new instance BorderLine, // b) cloning the new instance with the value of b0.HorizontalLine // c) modifying the new instance // d) setting b0.HorizontalLine with the value of the new instance
OUString sTestSource2(
u"Function doUnitTest()\n" "Dim b0 as new \"com.sun.star.table.TableBorder\", l as new \"com.sun.star.table.BorderLine\"\n" "l = b0.HorizontalLine\n" "l.OuterLineWidth = 9\n" "b0.HorizontalLine = l\n" "doUnitTest = b0.HorizontalLine.OuterLineWidth\n" "End Function\n"_ustr
);
OUString sTestSource2Alt(
u"Function doUnitTest()\n" "Dim b0 as new \"com.sun.star.table.TableBorder\", l as new \"com.sun.star.table.BorderLine\"\n" "l = b0.HorizontalLine\n" "l.OuterLineWidth = 9\n" "b0.HorizontalLine = l\n" "doUnitTest = b0\n" "End Function\n"_ustr
); // it should be legal to assign a variant to a struct ( and copy by val ) // make sure we aren't copying by reference, we make sure that l is not // a reference copy of b0.HorizontalLine, each one should have an // OuterLineWidth of 4 & 9 respectively and we should be returning // 13 the sum of the two ( hopefully unique values if we haven't copied by reference )
OUString sTestSource3(
u"Function doUnitTest()\n" "Dim b0 as new \"com.sun.star.table.TableBorder\"\n" "l = b0.HorizontalLine\n" "l.OuterLineWidth = 9\n" "b0.HorizontalLine = l\n" "l.OuterLineWidth = 4\n" "doUnitTest = b0.HorizontalLine.OuterLineWidth + l.OuterLineWidth\n" "End Function\n"_ustr
);
// nearly the same as above but this time for a fixed type // variable
OUString sTestSource4(
u"Function doUnitTest()\n" "Dim b0 as new \"com.sun.star.table.TableBorder\", l as new \"com.sun.star.table.BorderLine\"\n" "l = b0.HorizontalLine\n" "l.OuterLineWidth = 9\n" "b0.HorizontalLine = l\n" "l.OuterLineWidth = 4\n" "doUnitTest = b0.HorizontalLine.OuterLineWidth + l.OuterLineWidth\n" "End Function\n"_ustr
);
OUString sTestSource4Alt(
u"Function doUnitTest()\n" "Dim b0 as new \"com.sun.star.table.TableBorder\", l as new \"com.sun.star.table.BorderLine\"\n" "l = b0.HorizontalLine\n" "l.OuterLineWidth = 9\n" "b0.HorizontalLine = l\n" "l.OuterLineWidth = 4\n" "Dim result(1)\n" "result(0) = b0\n" "result(1) = l\n" "doUnitTest = result\n" "End Function\n"_ustr
);
// Although basic might appear to correctly change nested struct elements // fdo#60117 shows that basic can be fooled ( and even the watch(ed) variable // in the debugger shows the expected values ) // We need to additionally check the actual uno struct to see if the // changes made are *really* reflected in the object
OUString sTestSource5(
u"Function doUnitTest() as Object\n" "Dim aWinDesc as new \"com.sun.star.awt.WindowDescriptor\"\n" "Dim aRect as new \"com.sun.star.awt.Rectangle\"\n" "aRect.X = 200\n" "aWinDesc.Bounds = aRect\n" "doUnitTest = aWinDesc\n" "End Function\n"_ustr
);
table::BorderLine aBorderLine;
aResult[1] >>= aBorderLine;
result = aBorder.HorizontalLine.OuterLineWidth;
CPPUNIT_ASSERT_EQUAL(9, result );
result = aBorderLine.OuterLineWidth;
CPPUNIT_ASSERT_EQUAL(4, result );
}
table::BorderLine aBorderLine;
aResult[1] >>= aBorderLine;
result = aBorder.HorizontalLine.OuterLineWidth;
CPPUNIT_ASSERT_EQUAL(9, result );
result = aBorderLine.OuterLineWidth;
CPPUNIT_ASSERT_EQUAL(4, result );
}
// Without the fix in place, it would have crashed here
SbxVariableRef pNew = myMacro.Run();
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(1), pNew->GetInteger());
}
// Put the test suite in the registry
CPPUNIT_TEST_SUITE_REGISTRATION(Nested_Struct);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.