1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  */
9 
10 #include <sal/config.h>
11 #include <test/bootstrapfixture.hxx>
12 
13 #include <com/sun/star/beans/PropertyAttribute.hpp>
14 #include <com/sun/star/beans/XPropertySet.hpp>
15 
16 #include <comphelper/genericpropertyset.hxx>
17 #include <comphelper/propertysetinfo.hxx>
18 
19 #include <xmloff/maptype.hxx>
20 #include <xmloff/xmlimp.hxx>
21 #include <xmloff/xmlmetai.hxx>
22 #include <xmloff/xmlexp.hxx>
23 #include <xmloff/xmltoken.hxx>
24 #include <xmloff/xmlaustp.hxx>
25 #include <SchXMLExport.hxx>
26 #include <XMLChartPropertySetMapper.hxx>
27 #include <comphelper/processfactory.hxx>
28 
29 using namespace ::xmloff::token;
30 using namespace ::com::sun::star;
31 
32 class Test : public test::BootstrapFixture {
33 public:
34     Test();
35 
36     virtual void setUp() override;
37     virtual void tearDown() override;
38 
39     void testAutoStylePool();
40     void testMetaGenerator();
41 
42     CPPUNIT_TEST_SUITE(Test);
43     CPPUNIT_TEST(testAutoStylePool);
44     CPPUNIT_TEST(testMetaGenerator);
45     CPPUNIT_TEST_SUITE_END();
46 private:
47     std::unique_ptr<SvXMLExport> pExport;
48 };
49 
Test()50 Test::Test()
51 {
52 }
53 
setUp()54 void Test::setUp()
55 {
56     BootstrapFixture::setUp();
57 
58     pExport.reset(new SchXMLExport(
59         comphelper::getProcessComponentContext(), "SchXMLExport.Compact",
60         SvXMLExportFlags::ALL));
61 }
62 
tearDown()63 void Test::tearDown()
64 {
65     pExport.reset();
66     BootstrapFixture::tearDown();
67 }
68 
testAutoStylePool()69 void Test::testAutoStylePool()
70 {
71     rtl::Reference< SvXMLAutoStylePoolP > xPool(
72         new SvXMLAutoStylePoolP( *pExport ) );
73     rtl::Reference< XMLPropertySetMapper > xSetMapper(
74         new XMLChartPropertySetMapper( true) );
75     rtl::Reference< XMLChartExportPropertyMapper > xExportPropMapper(
76         new XMLChartExportPropertyMapper( xSetMapper, *pExport ) );
77 
78     xPool->AddFamily( XML_STYLE_FAMILY_TEXT_PARAGRAPH,
79                       GetXMLToken( XML_PARAGRAPH ),
80                       xExportPropMapper.get(),
81                       OUString( "Bob" ) );
82 
83     std::vector< XMLPropertyState > aProperties;
84     OUString aName = xPool->Add( XML_STYLE_FAMILY_TEXT_PARAGRAPH, "", aProperties );
85 
86     // not that interesting but worth checking
87     bool bHack = (getenv("LIBO_ONEWAY_STABLE_ODF_EXPORT") != nullptr);
88     if (bHack)
89         CPPUNIT_ASSERT_EQUAL_MESSAGE( "style / naming changed", OUString("Bob"), aName );
90     else
91         CPPUNIT_ASSERT_EQUAL_MESSAGE( "style / naming changed", OUString("Bob1"), aName );
92 
93     // find ourselves again:
94     OUString aSameName = xPool->Find( XML_STYLE_FAMILY_TEXT_PARAGRAPH, "", aProperties );
95     CPPUNIT_ASSERT_EQUAL_MESSAGE( "same style not found", aName, aSameName );
96 }
97 
testMetaGenerator()98 void Test::testMetaGenerator()
99 {
100     comphelper::PropertyMapEntry const aInfoMap[] = {
101         { OUString("BuildId"), 0, ::cppu::UnoType<OUString>::get(), beans::PropertyAttribute::MAYBEVOID, 0 },
102         { OUString(), 0, css::uno::Type(), 0, 0 }
103     };
104     uno::Reference<beans::XPropertySet> const xInfoSet(
105         comphelper::GenericPropertySet_CreateInstance(
106             new comphelper::PropertySetInfo(aInfoMap)));
107 
108     static struct {
109         char const*const generator;
110         char const*const buildId;
111         sal_uInt16 const result;
112     } const tests [] = {
113         // foreign
114         { "AbiWord/2.8.6 (unix, gtk)", "", SvXMLImport::ProductVersionUnknown },
115         { "Aspose.Words for Java 13.10.0.0", "", SvXMLImport::ProductVersionUnknown },
116         { "CIB jsmerge 1.0.0", "", SvXMLImport::ProductVersionUnknown },
117         { "Calligra/2.4.3", "", SvXMLImport::ProductVersionUnknown },
118         { "CocoaODFWriter/1339", "", SvXMLImport::ProductVersionUnknown },
119         { "KOffice/1.4.1", "", SvXMLImport::ProductVersionUnknown },
120         { "KPresenter 1.3", "", SvXMLImport::ProductVersionUnknown },
121         { "KSpread 1.3.2", "", SvXMLImport::ProductVersionUnknown },
122         { "Lotus Symphony/1.2.0_20081023.1730/Win32", "", SvXMLImport::ProductVersionUnknown },
123         { "Microsoft Excel Online", "", SvXMLImport::ProductVersionUnknown },
124         { "MicrosoftOffice/12.0 MicrosoftExcel/CalculationVersion-4518", "", SvXMLImport::ProductVersionUnknown },
125         { "MicrosoftOffice/15.0 MicrosoftWord", "", SvXMLImport::ProductVersionUnknown },
126         { "ODF Converter v1.0.0", "", SvXMLImport::ProductVersionUnknown },
127         { "ODF::lpOD 1.121", "", SvXMLImport::ProductVersionUnknown },
128         { "ODFDOM/0.6.1$Build-1", "", SvXMLImport::ProductVersionUnknown },
129         { "ODFPY/0.9.6", "", SvXMLImport::ProductVersionUnknown },
130         { "OpenXML/ODF Translator Command Line Tool 3.0 2.0.0", "", SvXMLImport::ProductVersionUnknown },
131         { "Org-7.8.03/Emacs-24.0.93.1", "", SvXMLImport::ProductVersionUnknown },
132         { "TeX4ht from eqns_long.tex, options: xhtml,ooffice,refcaption", "", SvXMLImport::ProductVersionUnknown },
133         { "TextMaker", "", SvXMLImport::ProductVersionUnknown },
134         { "docbook2odf generator (http://open.comsultia.com/docbook2odf/)", "", SvXMLImport::ProductVersionUnknown },
135         { "fig2sxd", "", SvXMLImport::ProductVersionUnknown },
136         { "gnumeric/1.10.9", "", SvXMLImport::ProductVersionUnknown },
137         { "libodfgen/0.1.6", "", SvXMLImport::ProductVersionUnknown },
138 
139         // OOo 1.x
140         { "StarSuite 6.0 (Linux)", "645$8687", SvXMLImport::OOo_1x },
141         { "StarOffice 6.1 (Win32)", "645$8687", SvXMLImport::OOo_1x },
142         { "OpenOffice.org 1.1.2RC3.DE (Win32)", "645$8687", SvXMLImport::OOo_1x },
143         { "OpenOffice.org 1.1.5 (Win32)", "645$8687", SvXMLImport::OOo_1x },
144         { "StarOffice 7 (Win32)", "645$8687", SvXMLImport::OOo_1x },
145 
146         // OOo 2.x
147         { "Sun_ODF_Plugin_for_Microsoft_Office/1.1$Win32 OpenOffice.org_project/680m5$Build-9221", "680$9221", SvXMLImport::OOo_2x },
148         { "StarSuite/8$Win32 OpenOffice.org_project/680m6$Build-9095", "680$9095", SvXMLImport::OOo_2x },
149         { "StarOffice/8$Win32 OpenOffice.org_project/680m93$Build-8897", "680$8897", SvXMLImport::OOo_2x },
150         { "OpenOffice.org/2.0$Linux OpenOffice.org_project/680m3$Build-8968", "680$8968", SvXMLImport::OOo_2x },
151         { "OpenOffice.org/2.1$Win32 OpenOffice.org_project/680m6$Build-9095", "680$9095", SvXMLImport::OOo_2x },
152         { "OpenOffice.org/2.4$Win32 OpenOffice.org_project/680m248$Build-9274", "680$9274", SvXMLImport::OOo_2x },
153 
154         // OOo 3.x
155         { "OpenOffice.org/3.0$Solaris_Sparc OpenOffice.org_project/300m9$Build-9358", "300$9358", SvXMLImport::OOo_30x },
156         { "StarSuite/9$Unix OpenOffice.org_project/300m9$Build-9358", "300$9358", SvXMLImport::OOo_30x },
157         { "StarOffice/9$Win32 OpenOffice.org_project/300m14$Build-9376", "300$9376", SvXMLImport::OOo_30x },
158         { "OpenOffice.org/3.1$Solaris_x86 OpenOffice.org_project/310m11$Build-9399", "310$9399", SvXMLImport::OOo_31x },
159         { "IBM_Lotus_Symphony/2.0$Win32 OpenOffice.org_project/310m11$Build-9399", "310$9399", SvXMLImport::OOo_31x },
160         { "BrOffice.org/3.1$Linux OpenOffice.org_project/310m11$Build-9399", "310$9399", SvXMLImport::OOo_31x },
161         { "StarOffice/9$Solaris_Sparc OpenOffice.org_project/310m19$Build-9420", "310$9420", SvXMLImport::OOo_31x },
162         { "OpenOffice.org/3.2$Linux OpenOffice.org_project/320m12$Build-9483", "320$9483", SvXMLImport::OOo_32x },
163         { "StarOffice/9$Win32 OpenOffice.org_project/320m12$Build-9483", "320$9483", SvXMLImport::OOo_32x },
164         { "OpenOffice.org/3.3$Linux OpenOffice.org_project/330m20$Build-9567", "330$9567", SvXMLImport::OOo_33x },
165         { "Oracle_Open_Office/3.3$Win32 OpenOffice.org_project/330m7$Build-9552", "330$9552", SvXMLImport::OOo_33x },
166         { "OpenOffice.org/3.4$Unix OpenOffice.org_project/340m1$Build-9590", "340$9590", SvXMLImport::OOo_34x },
167 
168         // AOO versions
169         { "OpenOffice/4.0.0$Win32 OpenOffice.org_project/400m3$Build-9702", "400$9702", SvXMLImport::AOO_40x },
170         { "OpenOffice/4.0.1$Linux OpenOffice.org_project/401m4$Build-9713", "401$9713", SvXMLImport::AOO_40x },
171         { "OpenOffice/4.1.1$FreeBSD/amd64 OpenOffice.org_project/411m6$Build-9775", "411$9775", SvXMLImport::AOO_4x },
172         { "OpenOffice/4.1.2$OS/2 OpenOffice.org_project/412m3$Build-9782-bww", "412$9782-bww", SvXMLImport::AOO_4x },
173         { "OpenOffice/4.1.4$Unix OpenOffice.org_project/414m2$Build-9785", "414$9785", SvXMLImport::AOO_4x },
174 
175         // LO versions
176         { "LibreOffice/3.3$Linux LibreOffice_project/330m17$Build-3", "330$3;33", SvXMLImport::LO_3x },
177         { "BrOffice/3.3$Win32 LibreOffice_project/330m19$Build-8", "330$8;33", SvXMLImport::LO_3x },
178         { "LibreOffice/3.4$Linux LibreOffice_project/340m1$Build-1206", "340$1206;34", SvXMLImport::LO_3x },
179         { "LibreOffice/3.5$Linux_X86_64 LibreOffice_project/3fa2330-e49ffd2-90d118b-705e248-051e21c", ";35", SvXMLImport::LO_3x },
180         { "LibreOffice/3.6$Windows_x86 LibreOffice_project/a9a0717-273e462-768e6e3-978247f-65e65f", ";36", SvXMLImport::LO_3x },
181         { "LibreOffice/4.0.2.2$Windows_x86 LibreOffice_project/4c82dcdd6efcd48b1d8bba66bfe1989deee49c3", ";4022", SvXMLImport::LO_41x },
182         { "LibreOffice/4.1.2.3$MacOSX_x86 LibreOffice_project/40b2d7fde7e8d2d7bc5a449dc65df4d08a7dd38", ";4123", SvXMLImport::LO_41x },
183         { "LibreOffice/4.2.8.2$Windows_x86 LibreOffice_project/48d50dbfc06349262c9d50868e5c1f630a573ebd", ";4282", SvXMLImport::LO_42x },
184         { "LibreOffice_from_Collabora_4.2-8/4.2.10.8$Linux_x86 LibreOffice_project/84584cc237b2eb93f7684d8fcd063bb37e87b5fb", ";42108", SvXMLImport::LO_42x },
185         { "LibreOffice/4.3.3.2$Linux_x86 LibreOffice_project/9bb7eadab57b6755b1265afa86e04bf45fbfc644", ";4332", SvXMLImport::LO_43x },
186         { "LibreOffice_from_Collabora_4.4-10/4.4.10.9$Linux_x86 LibreOffice_project/5600b19b88a01bbb669b0900100760758dff8c26", ";44109", SvXMLImport::LO_44x },
187         { "LibreOffice/4.3.3.2$Linux_X86_64 LibreOffice_project/430m0$Build-2", "430$2;4332", SvXMLImport::LO_43x },
188         { "LibreOffice/4.4.3.2$Linux_x86 LibreOffice_project/88805f81e9fe61362df02b9941de8e38a9b5fd16", ";4432", SvXMLImport::LO_44x },
189         { "LibreOffice/5.0.1.1$Linux_x86 LibreOffice_project/00m0$Build-1", "00$1;5011", SvXMLImport::LO_5x },
190         { "LibreOffice/5.0.3.2$Windows_X86_64 LibreOffice_project/e5f16313668ac592c1bfb310f4390624e3dbfb75", ";5032", SvXMLImport::LO_5x },
191         { "Collabora_Office/5.0.10.19$Linux_X86_64 LibreOffice_project/95060d44300d8866fa81c16fc8fe2afe22d63777", ";501019", SvXMLImport::LO_5x },
192         { "LibreOffice/5.1.6.2.0$Linux_X86_64 LibreOffice_project/10$Build-2", ";51620", SvXMLImport::LO_5x },
193         { "Collabora_Office/5.1.10.17$Linux_X86_64 LibreOffice_project/a104cbe76eefca3cf23973da68893d2225fd718b", ";511017", SvXMLImport::LO_5x },
194         { "LibreOffice/5.2.1.2$Windows_X86_64 LibreOffice_project/31dd62db80d4e60af04904455ec9c9219178d620", ";5212", SvXMLImport::LO_5x },
195         { "LibreOffice_Vanilla/5.2.3.5$MacOSX_X86_64 LibreOffice_project/83adc9c35c74e0badc710d981405858b1179a327", ";5235", SvXMLImport::LO_5x },
196         { "LibreOffice/5.3.4.2$Windows_X86_64 LibreOffice_project/f82d347ccc0be322489bf7da61d7e4ad13fe2ff3", ";5342", SvXMLImport::LO_5x },
197         { "Collabora_Office/5.3.10.27$Linux_X86_64 LibreOffice_project/7a5a5378661e338a44666c08773cc796b8d1c84a", ";531027", SvXMLImport::LO_5x },
198         { "LibreOfficeDev/5.4.7.0.0$Linux_X86_64 LibreOffice_project/ba7461fc88c08e75e315f786020a2946e56166c9", ";54700", SvXMLImport::LO_5x },
199         { "LibreOfficeDev/6.0.3.0.0$Linux_X86_64 LibreOffice_project/34442b85bfb0c451738b4db023345a7484463321", ";60300", SvXMLImport::LO_6x },
200     };
201 
202     for (size_t i = 0; i < SAL_N_ELEMENTS(tests); ++i)
203     {
204         // the DocumentInfo instance is cached so need fresh SvXMLImport
205         rtl::Reference<SvXMLImport> const pImport(new SvXMLImport(
206             comphelper::getProcessComponentContext(), "testdummy",
207             SvXMLImportFlags::ALL));
208 
209         pImport->initialize(uno::Sequence<uno::Any>{ uno::Any(xInfoSet) });
210 
211         SvXMLMetaDocumentContext::setBuildId(
212                 OUString::createFromAscii(tests[i].generator), xInfoSet);
213         if (tests[i].buildId[0] != '\0')
214         {
215             CPPUNIT_ASSERT_EQUAL(OUString::createFromAscii(tests[i].buildId),
216                     xInfoSet->getPropertyValue("BuildId").get<OUString>());
217         }
218         else
219         {
220             CPPUNIT_ASSERT(!xInfoSet->getPropertyValue("BuildId").hasValue());
221         }
222         CPPUNIT_ASSERT_EQUAL(tests[i].result, pImport->getGeneratorVersion());
223     }
224 }
225 
226 CPPUNIT_TEST_SUITE_REGISTRATION(Test);
227 
228 CPPUNIT_PLUGIN_IMPLEMENT();
229 
230 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
231