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