xref: /trunk/main/sfx2/qa/gtest/test_metadatable.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1*528c1602SDamjan Jovanovic /**************************************************************
2*528c1602SDamjan Jovanovic  *
3*528c1602SDamjan Jovanovic  * Licensed to the Apache Software Foundation (ASF) under one
4*528c1602SDamjan Jovanovic  * or more contributor license agreements.  See the NOTICE file
5*528c1602SDamjan Jovanovic  * distributed with this work for additional information
6*528c1602SDamjan Jovanovic  * regarding copyright ownership.  The ASF licenses this file
7*528c1602SDamjan Jovanovic  * to you under the Apache License, Version 2.0 (the
8*528c1602SDamjan Jovanovic  * "License"); you may not use this file except in compliance
9*528c1602SDamjan Jovanovic  * with the License.  You may obtain a copy of the License at
10*528c1602SDamjan Jovanovic  *
11*528c1602SDamjan Jovanovic  *   http://www.apache.org/licenses/LICENSE-2.0
12*528c1602SDamjan Jovanovic  *
13*528c1602SDamjan Jovanovic  * Unless required by applicable law or agreed to in writing,
14*528c1602SDamjan Jovanovic  * software distributed under the License is distributed on an
15*528c1602SDamjan Jovanovic  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*528c1602SDamjan Jovanovic  * KIND, either express or implied.  See the License for the
17*528c1602SDamjan Jovanovic  * specific language governing permissions and limitations
18*528c1602SDamjan Jovanovic  * under the License.
19*528c1602SDamjan Jovanovic  *
20*528c1602SDamjan Jovanovic  *************************************************************/
21*528c1602SDamjan Jovanovic 
22*528c1602SDamjan Jovanovic 
23*528c1602SDamjan Jovanovic 
24*528c1602SDamjan Jovanovic #include "gtest/gtest.h"
25*528c1602SDamjan Jovanovic #include <rtl/ustrbuf.hxx>
26*528c1602SDamjan Jovanovic 
27*528c1602SDamjan Jovanovic #include <com/sun/star/util/DateTime.hpp>
28*528c1602SDamjan Jovanovic #include <com/sun/star/util/Date.hpp>
29*528c1602SDamjan Jovanovic #include <com/sun/star/util/Duration.hpp>
30*528c1602SDamjan Jovanovic 
31*528c1602SDamjan Jovanovic #include <sfx2/Metadatable.hxx>
32*528c1602SDamjan Jovanovic #include <sfx2/XmlIdRegistry.hxx>
33*528c1602SDamjan Jovanovic 
34*528c1602SDamjan Jovanovic 
35*528c1602SDamjan Jovanovic using namespace ::com::sun::star;
36*528c1602SDamjan Jovanovic 
37*528c1602SDamjan Jovanovic 
38*528c1602SDamjan Jovanovic namespace {
39*528c1602SDamjan Jovanovic 
40*528c1602SDamjan Jovanovic class MetadatableTest
41*528c1602SDamjan Jovanovic     : public ::testing::Test
42*528c1602SDamjan Jovanovic {
43*528c1602SDamjan Jovanovic public:
44*528c1602SDamjan Jovanovic     virtual void SetUp();
45*528c1602SDamjan Jovanovic     virtual void TearDown();
46*528c1602SDamjan Jovanovic };
47*528c1602SDamjan Jovanovic 
SetUp()48*528c1602SDamjan Jovanovic void MetadatableTest::SetUp()
49*528c1602SDamjan Jovanovic {
50*528c1602SDamjan Jovanovic }
51*528c1602SDamjan Jovanovic 
TearDown()52*528c1602SDamjan Jovanovic void MetadatableTest::TearDown()
53*528c1602SDamjan Jovanovic {
54*528c1602SDamjan Jovanovic }
55*528c1602SDamjan Jovanovic 
56*528c1602SDamjan Jovanovic 
57*528c1602SDamjan Jovanovic class MockMetadatable
58*528c1602SDamjan Jovanovic     : public ::sfx2::Metadatable
59*528c1602SDamjan Jovanovic {
60*528c1602SDamjan Jovanovic private:
61*528c1602SDamjan Jovanovic     ::sfx2::IXmlIdRegistry & m_rRegistry;
62*528c1602SDamjan Jovanovic 
63*528c1602SDamjan Jovanovic public:
MockMetadatable(::sfx2::IXmlIdRegistry & i_rReg,bool const i_isInClip=false)64*528c1602SDamjan Jovanovic     MockMetadatable(::sfx2::IXmlIdRegistry & i_rReg,
65*528c1602SDamjan Jovanovic             bool const i_isInClip = false)
66*528c1602SDamjan Jovanovic         : m_rRegistry(i_rReg)
67*528c1602SDamjan Jovanovic         , m_bInClipboard(i_isInClip), m_bInUndo(false), m_bInContent(true) {}
68*528c1602SDamjan Jovanovic     bool m_bInClipboard;
69*528c1602SDamjan Jovanovic     bool m_bInUndo;
70*528c1602SDamjan Jovanovic     bool m_bInContent;
IsInClipboard() const71*528c1602SDamjan Jovanovic     virtual bool IsInClipboard() const { return m_bInClipboard; }
IsInUndo() const72*528c1602SDamjan Jovanovic     virtual bool IsInUndo() const { return m_bInUndo; }
IsInContent() const73*528c1602SDamjan Jovanovic     virtual bool IsInContent() const { return m_bInContent; }
GetRegistry()74*528c1602SDamjan Jovanovic     virtual ::sfx2::IXmlIdRegistry& GetRegistry() { return m_rRegistry; }
75*528c1602SDamjan Jovanovic     virtual ::com::sun::star::uno::Reference<
MakeUnoObject()76*528c1602SDamjan Jovanovic         ::com::sun::star::rdf::XMetadatable > MakeUnoObject() { return 0; }
77*528c1602SDamjan Jovanovic };
78*528c1602SDamjan Jovanovic 
operator ==(beans::StringPair p1,beans::StringPair p2)79*528c1602SDamjan Jovanovic static bool operator==(beans::StringPair p1, beans::StringPair p2)
80*528c1602SDamjan Jovanovic {
81*528c1602SDamjan Jovanovic     return p1.First == p2.First && p1.Second == p2.Second;
82*528c1602SDamjan Jovanovic }
83*528c1602SDamjan Jovanovic 
TEST_F(MetadatableTest,test)84*528c1602SDamjan Jovanovic TEST_F(MetadatableTest, test)
85*528c1602SDamjan Jovanovic {
86*528c1602SDamjan Jovanovic     OSL_TRACE("SwMetadatable test(): start\n");
87*528c1602SDamjan Jovanovic     ::std::auto_ptr< ::sfx2::IXmlIdRegistry > const pReg(
88*528c1602SDamjan Jovanovic         ::sfx2::createXmlIdRegistry(false) );
89*528c1602SDamjan Jovanovic     ::std::auto_ptr< ::sfx2::IXmlIdRegistry > const pRegClip(
90*528c1602SDamjan Jovanovic         ::sfx2::createXmlIdRegistry(true) );
91*528c1602SDamjan Jovanovic 
92*528c1602SDamjan Jovanovic     MockMetadatable m1(*pReg);
93*528c1602SDamjan Jovanovic     MockMetadatable m2(*pReg);
94*528c1602SDamjan Jovanovic     MockMetadatable m3(*pReg);
95*528c1602SDamjan Jovanovic     MockMetadatable m4(*pReg);
96*528c1602SDamjan Jovanovic     MockMetadatable m5(*pReg);
97*528c1602SDamjan Jovanovic     ::rtl::OUString empty;
98*528c1602SDamjan Jovanovic     ::rtl::OUString content( ::rtl::OUString::createFromAscii("content.xml") );
99*528c1602SDamjan Jovanovic     ::rtl::OUString styles ( ::rtl::OUString::createFromAscii("styles.xml") );
100*528c1602SDamjan Jovanovic     ::rtl::OUString sid1( ::rtl::OUString::createFromAscii("id1") );
101*528c1602SDamjan Jovanovic     ::rtl::OUString sid2( ::rtl::OUString::createFromAscii("id2") );
102*528c1602SDamjan Jovanovic     ::rtl::OUString sid3( ::rtl::OUString::createFromAscii("id3") );
103*528c1602SDamjan Jovanovic     ::rtl::OUString sid4( ::rtl::OUString::createFromAscii("id4") );
104*528c1602SDamjan Jovanovic     beans::StringPair id1(content, sid1);
105*528c1602SDamjan Jovanovic     beans::StringPair id2(content, sid2);
106*528c1602SDamjan Jovanovic     beans::StringPair id3(content, sid3);
107*528c1602SDamjan Jovanovic     beans::StringPair id4(styles,  sid4);
108*528c1602SDamjan Jovanovic     beans::StringPair id3e(empty,  sid3);
109*528c1602SDamjan Jovanovic     beans::StringPair id4e(empty,  sid4);
110*528c1602SDamjan Jovanovic     m1.SetMetadataReference(id1);
111*528c1602SDamjan Jovanovic     ASSERT_TRUE(m1.GetMetadataReference() == id1) << "set failed";
112*528c1602SDamjan Jovanovic     try {
113*528c1602SDamjan Jovanovic         m2.SetMetadataReference(id1);
114*528c1602SDamjan Jovanovic         ASSERT_TRUE(false) << "set duplicate succeeded";
115*528c1602SDamjan Jovanovic     } catch (lang::IllegalArgumentException) { }
116*528c1602SDamjan Jovanovic     m1.SetMetadataReference(id1);
117*528c1602SDamjan Jovanovic     ASSERT_TRUE(m1.GetMetadataReference() == id1) << "set failed (existing)";
118*528c1602SDamjan Jovanovic     m1.EnsureMetadataReference();
119*528c1602SDamjan Jovanovic     ASSERT_TRUE(m1.GetMetadataReference() == id1) << "ensure failed (existing)";
120*528c1602SDamjan Jovanovic 
121*528c1602SDamjan Jovanovic     m2.EnsureMetadataReference();
122*528c1602SDamjan Jovanovic     beans::StringPair m2id(m2.GetMetadataReference());
123*528c1602SDamjan Jovanovic     ASSERT_TRUE(m2id.Second.getLength()) << "ensure failed";
124*528c1602SDamjan Jovanovic     m2.EnsureMetadataReference();
125*528c1602SDamjan Jovanovic     ASSERT_TRUE(m2.GetMetadataReference() == m2id) << "ensure failed (idempotent)";
126*528c1602SDamjan Jovanovic 
127*528c1602SDamjan Jovanovic     m1.m_bInUndo = true;
128*528c1602SDamjan Jovanovic     ASSERT_TRUE(!m1.GetMetadataReference().Second.getLength()) << "move to undo failed";
129*528c1602SDamjan Jovanovic 
130*528c1602SDamjan Jovanovic     m1.m_bInUndo = false;
131*528c1602SDamjan Jovanovic     ASSERT_TRUE(m1.GetMetadataReference() == id1) << "move from undo failed";
132*528c1602SDamjan Jovanovic 
133*528c1602SDamjan Jovanovic     m1.m_bInUndo = true;
134*528c1602SDamjan Jovanovic     try {
135*528c1602SDamjan Jovanovic         m2.SetMetadataReference(id1); // steal!
136*528c1602SDamjan Jovanovic     } catch (lang::IllegalArgumentException &) {
137*528c1602SDamjan Jovanovic         FAIL() << "set duplicate to undo failed";
138*528c1602SDamjan Jovanovic     }
139*528c1602SDamjan Jovanovic     m1.m_bInUndo = false;
140*528c1602SDamjan Jovanovic     ASSERT_TRUE(!m1.GetMetadataReference().Second.getLength()) << "move from undo: duplicate";
141*528c1602SDamjan Jovanovic 
142*528c1602SDamjan Jovanovic     m3.RegisterAsCopyOf(m2);
143*528c1602SDamjan Jovanovic     ASSERT_TRUE(m2.GetMetadataReference() == id1) << "copy: source";
144*528c1602SDamjan Jovanovic     ASSERT_TRUE(!m3.GetMetadataReference().Second.getLength()) << "copy: duplicate";
145*528c1602SDamjan Jovanovic     m4.RegisterAsCopyOf(m3);
146*528c1602SDamjan Jovanovic     ASSERT_TRUE(m2.GetMetadataReference() == id1) << "copy: source";
147*528c1602SDamjan Jovanovic     ASSERT_TRUE(!m3.GetMetadataReference().Second.getLength()) << "copy: duplicate";
148*528c1602SDamjan Jovanovic     ASSERT_TRUE(!m4.GetMetadataReference().Second.getLength()) << "copy: duplicate";
149*528c1602SDamjan Jovanovic     m2.m_bInUndo = true;
150*528c1602SDamjan Jovanovic     ASSERT_TRUE(m3.GetMetadataReference() == id1) << "duplicate to undo";
151*528c1602SDamjan Jovanovic     ASSERT_TRUE(!m2.GetMetadataReference().Second.getLength()) << "duplicate to undo";
152*528c1602SDamjan Jovanovic     m2.m_bInUndo = false;
153*528c1602SDamjan Jovanovic     ASSERT_TRUE(m2.GetMetadataReference() == id1) << "duplicate from undo";
154*528c1602SDamjan Jovanovic     ASSERT_TRUE(!m3.GetMetadataReference().Second.getLength()) << "duplicate from undo";
155*528c1602SDamjan Jovanovic 
156*528c1602SDamjan Jovanovic     m4.EnsureMetadataReference(); // new!
157*528c1602SDamjan Jovanovic     beans::StringPair m4id(m4.GetMetadataReference());
158*528c1602SDamjan Jovanovic     ASSERT_TRUE(m4id.Second.getLength() && !(m4id == id1)) << "ensure on duplicate";
159*528c1602SDamjan Jovanovic 
160*528c1602SDamjan Jovanovic     MockMetadatable mc1(*pRegClip, true); // in clipboard
161*528c1602SDamjan Jovanovic     MockMetadatable mc2(*pRegClip, true);
162*528c1602SDamjan Jovanovic     MockMetadatable mc3(*pRegClip, true);
163*528c1602SDamjan Jovanovic     MockMetadatable mc4(*pRegClip, true);
164*528c1602SDamjan Jovanovic     MockMetadatable m2p(*pReg);
165*528c1602SDamjan Jovanovic     MockMetadatable m3p(*pReg);
166*528c1602SDamjan Jovanovic 
167*528c1602SDamjan Jovanovic     mc1.SetMetadataReference(id2);
168*528c1602SDamjan Jovanovic     ASSERT_TRUE(mc1.GetMetadataReference() == id2) << "set failed";
169*528c1602SDamjan Jovanovic     try {
170*528c1602SDamjan Jovanovic         mc2.SetMetadataReference(id2);
171*528c1602SDamjan Jovanovic         FAIL() << "set duplicate succeeded";
172*528c1602SDamjan Jovanovic     } catch (lang::IllegalArgumentException) { }
173*528c1602SDamjan Jovanovic     mc1.SetMetadataReference(id2);
174*528c1602SDamjan Jovanovic     ASSERT_TRUE(mc1.GetMetadataReference() == id2) << "set failed (existing)";
175*528c1602SDamjan Jovanovic     mc1.EnsureMetadataReference();
176*528c1602SDamjan Jovanovic     ASSERT_TRUE(mc1.GetMetadataReference() == id2) << "ensure failed (existing)";
177*528c1602SDamjan Jovanovic     mc2.EnsureMetadataReference();
178*528c1602SDamjan Jovanovic     beans::StringPair mc2id(mc2.GetMetadataReference());
179*528c1602SDamjan Jovanovic     ASSERT_TRUE(mc2id.Second.getLength()) << "ensure failed";
180*528c1602SDamjan Jovanovic     mc2.EnsureMetadataReference();
181*528c1602SDamjan Jovanovic     ASSERT_TRUE(mc2.GetMetadataReference() == mc2id) << "ensure failed (idempotent)";
182*528c1602SDamjan Jovanovic     mc2.RemoveMetadataReference();
183*528c1602SDamjan Jovanovic     ASSERT_TRUE(!mc2.GetMetadataReference().Second.getLength()) << "remove failed";
184*528c1602SDamjan Jovanovic 
185*528c1602SDamjan Jovanovic     // set up mc2 as copy of m2 and mc3 as copy of m3
186*528c1602SDamjan Jovanovic     mc3.RegisterAsCopyOf(m3);
187*528c1602SDamjan Jovanovic     ASSERT_TRUE(!mc3.GetMetadataReference().Second.getLength()) << "copy to clipboard (latent)";
188*528c1602SDamjan Jovanovic     mc2.RegisterAsCopyOf(m2);
189*528c1602SDamjan Jovanovic     ASSERT_TRUE(mc2.GetMetadataReference() == id1) << "copy to clipboard (non-latent)";
190*528c1602SDamjan Jovanovic     // paste mc2 to m2p and mc3 to m3p
191*528c1602SDamjan Jovanovic     m2p.RegisterAsCopyOf(mc2);
192*528c1602SDamjan Jovanovic     ASSERT_TRUE(!m2p.GetMetadataReference().Second.getLength()) << "paste from clipboard (non-latent)";
193*528c1602SDamjan Jovanovic     m3p.RegisterAsCopyOf(mc3);
194*528c1602SDamjan Jovanovic     ASSERT_TRUE(!m3p.GetMetadataReference().Second.getLength()) << "paste from clipboard (latent)";
195*528c1602SDamjan Jovanovic     // delete m2, m2p, m3
196*528c1602SDamjan Jovanovic     m2.RemoveMetadataReference();
197*528c1602SDamjan Jovanovic     ASSERT_TRUE(!m2.GetMetadataReference().Second.getLength()) << "remove failed";
198*528c1602SDamjan Jovanovic     ASSERT_TRUE(m2p.GetMetadataReference() == id1) << "paste-remove (non-latent)";
199*528c1602SDamjan Jovanovic     m2p.RemoveMetadataReference();
200*528c1602SDamjan Jovanovic     ASSERT_TRUE(!m2p.GetMetadataReference().Second.getLength()) << "remove failed";
201*528c1602SDamjan Jovanovic     ASSERT_TRUE(m3.GetMetadataReference() == id1) << "paste-remove2 (non-latent)";
202*528c1602SDamjan Jovanovic     m3.RemoveMetadataReference();
203*528c1602SDamjan Jovanovic     ASSERT_TRUE(!m3.GetMetadataReference().Second.getLength()) << "remove failed";
204*528c1602SDamjan Jovanovic     ASSERT_TRUE(m3p.GetMetadataReference() == id1) << "paste-remove (latent)";
205*528c1602SDamjan Jovanovic     // delete mc2
206*528c1602SDamjan Jovanovic     mc2.SetMetadataReference(beans::StringPair());
207*528c1602SDamjan Jovanovic     ASSERT_TRUE(!mc3.GetMetadataReference().Second.getLength()) << "in clipboard becomes non-latent";
208*528c1602SDamjan Jovanovic     // paste mc2
209*528c1602SDamjan Jovanovic     m2p.RegisterAsCopyOf(mc2);
210*528c1602SDamjan Jovanovic     ASSERT_TRUE(!m2p.GetMetadataReference().Second.getLength()) << "remove-paste";
211*528c1602SDamjan Jovanovic     ASSERT_TRUE(m3p.GetMetadataReference() == id1) << "remove-paste (stolen)";
212*528c1602SDamjan Jovanovic 
213*528c1602SDamjan Jovanovic     // auto-detect stream
214*528c1602SDamjan Jovanovic     m5.SetMetadataReference(id3e);
215*528c1602SDamjan Jovanovic     ASSERT_TRUE(m5.GetMetadataReference() == id3) << "auto-detect (content)";
216*528c1602SDamjan Jovanovic     m5.m_bInContent = false;
217*528c1602SDamjan Jovanovic     m5.SetMetadataReference(id4e);
218*528c1602SDamjan Jovanovic     ASSERT_TRUE(m5.GetMetadataReference() == id4) << "auto-detect (styles)";
219*528c1602SDamjan Jovanovic 
220*528c1602SDamjan Jovanovic     OSL_TRACE("sfx2::Metadatable test(): finished\n");
221*528c1602SDamjan Jovanovic }
222*528c1602SDamjan Jovanovic 
223*528c1602SDamjan Jovanovic 
224*528c1602SDamjan Jovanovic }
225*528c1602SDamjan Jovanovic 
main(int argc,char ** argv)226*528c1602SDamjan Jovanovic int main(int argc, char **argv)
227*528c1602SDamjan Jovanovic {
228*528c1602SDamjan Jovanovic     ::testing::InitGoogleTest(&argc, argv);
229*528c1602SDamjan Jovanovic     return RUN_ALL_TESTS();
230*528c1602SDamjan Jovanovic }
231