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