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 <sal/cppunit.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 ::CppUnit::TestFixture 42 { 43 public: 44 virtual void setUp(); 45 virtual void tearDown(); 46 47 void test(); 48 49 CPPUNIT_TEST_SUITE(MetadatableTest); 50 CPPUNIT_TEST(test); 51 CPPUNIT_TEST_SUITE_END(); 52 53 private: 54 }; 55 56 void MetadatableTest::setUp() 57 { 58 } 59 60 void MetadatableTest::tearDown() 61 { 62 } 63 64 65 class MockMetadatable 66 : public ::sfx2::Metadatable 67 { 68 private: 69 ::sfx2::IXmlIdRegistry & m_rRegistry; 70 71 public: 72 MockMetadatable(::sfx2::IXmlIdRegistry & i_rReg, 73 bool const i_isInClip = false) 74 : m_rRegistry(i_rReg) 75 , m_bInClipboard(i_isInClip), m_bInUndo(false), m_bInContent(true) {} 76 bool m_bInClipboard; 77 bool m_bInUndo; 78 bool m_bInContent; 79 virtual bool IsInClipboard() const { return m_bInClipboard; } 80 virtual bool IsInUndo() const { return m_bInUndo; } 81 virtual bool IsInContent() const { return m_bInContent; } 82 virtual ::sfx2::IXmlIdRegistry& GetRegistry() { return m_rRegistry; } 83 virtual ::com::sun::star::uno::Reference< 84 ::com::sun::star::rdf::XMetadatable > MakeUnoObject() { return 0; } 85 }; 86 87 static bool operator==(beans::StringPair p1, beans::StringPair p2) 88 { 89 return p1.First == p2.First && p1.Second == p2.Second; 90 } 91 92 void MetadatableTest::test() 93 { 94 OSL_TRACE("SwMetadatable test(): start\n"); 95 ::std::auto_ptr< ::sfx2::IXmlIdRegistry > const pReg( 96 ::sfx2::createXmlIdRegistry(false) ); 97 ::std::auto_ptr< ::sfx2::IXmlIdRegistry > const pRegClip( 98 ::sfx2::createXmlIdRegistry(true) ); 99 100 MockMetadatable m1(*pReg); 101 MockMetadatable m2(*pReg); 102 MockMetadatable m3(*pReg); 103 MockMetadatable m4(*pReg); 104 MockMetadatable m5(*pReg); 105 ::rtl::OUString empty; 106 ::rtl::OUString content( ::rtl::OUString::createFromAscii("content.xml") ); 107 ::rtl::OUString styles ( ::rtl::OUString::createFromAscii("styles.xml") ); 108 ::rtl::OUString sid1( ::rtl::OUString::createFromAscii("id1") ); 109 ::rtl::OUString sid2( ::rtl::OUString::createFromAscii("id2") ); 110 ::rtl::OUString sid3( ::rtl::OUString::createFromAscii("id3") ); 111 ::rtl::OUString sid4( ::rtl::OUString::createFromAscii("id4") ); 112 beans::StringPair id1(content, sid1); 113 beans::StringPair id2(content, sid2); 114 beans::StringPair id3(content, sid3); 115 beans::StringPair id4(styles, sid4); 116 beans::StringPair id3e(empty, sid3); 117 beans::StringPair id4e(empty, sid4); 118 m1.SetMetadataReference(id1); 119 CPPUNIT_ASSERT_MESSAGE("set failed", m1.GetMetadataReference() == id1); 120 try { 121 m2.SetMetadataReference(id1); 122 CPPUNIT_ASSERT_MESSAGE("set duplicate succeeded", false); 123 } catch (lang::IllegalArgumentException) { } 124 m1.SetMetadataReference(id1); 125 CPPUNIT_ASSERT_MESSAGE("set failed (existing)", 126 m1.GetMetadataReference() == id1); 127 m1.EnsureMetadataReference(); 128 CPPUNIT_ASSERT_MESSAGE("ensure failed (existing)", 129 m1.GetMetadataReference() == id1); 130 131 m2.EnsureMetadataReference(); 132 beans::StringPair m2id(m2.GetMetadataReference()); 133 CPPUNIT_ASSERT_MESSAGE("ensure failed", m2id.Second.getLength()); 134 m2.EnsureMetadataReference(); 135 CPPUNIT_ASSERT_MESSAGE("ensure failed (idempotent)", 136 m2.GetMetadataReference() == m2id); 137 138 m1.m_bInUndo = true; 139 CPPUNIT_ASSERT_MESSAGE("move to undo failed", 140 !m1.GetMetadataReference().Second.getLength()); 141 142 m1.m_bInUndo = false; 143 CPPUNIT_ASSERT_MESSAGE("move from undo failed", 144 m1.GetMetadataReference() == id1); 145 146 m1.m_bInUndo = true; 147 try { 148 m2.SetMetadataReference(id1); // steal! 149 } catch (lang::IllegalArgumentException &) { 150 CPPUNIT_FAIL("set duplicate to undo failed"); 151 } 152 m1.m_bInUndo = false; 153 CPPUNIT_ASSERT_MESSAGE("move from undo: duplicate", 154 !m1.GetMetadataReference().Second.getLength()); 155 156 m3.RegisterAsCopyOf(m2); 157 CPPUNIT_ASSERT_MESSAGE("copy: source", m2.GetMetadataReference() == id1); 158 CPPUNIT_ASSERT_MESSAGE("copy: duplicate", 159 !m3.GetMetadataReference().Second.getLength()); 160 m4.RegisterAsCopyOf(m3); 161 CPPUNIT_ASSERT_MESSAGE("copy: source", m2.GetMetadataReference() == id1); 162 CPPUNIT_ASSERT_MESSAGE("copy: duplicate", 163 !m3.GetMetadataReference().Second.getLength()); 164 CPPUNIT_ASSERT_MESSAGE("copy: duplicate", 165 !m4.GetMetadataReference().Second.getLength()); 166 m2.m_bInUndo = true; 167 CPPUNIT_ASSERT_MESSAGE("duplicate to undo", 168 m3.GetMetadataReference() == id1); 169 CPPUNIT_ASSERT_MESSAGE("duplicate to undo", 170 !m2.GetMetadataReference().Second.getLength()); 171 m2.m_bInUndo = false; 172 CPPUNIT_ASSERT_MESSAGE("duplicate from undo", 173 m2.GetMetadataReference() == id1); 174 CPPUNIT_ASSERT_MESSAGE("duplicate from undo", 175 !m3.GetMetadataReference().Second.getLength()); 176 177 m4.EnsureMetadataReference(); // new! 178 beans::StringPair m4id(m4.GetMetadataReference()); 179 CPPUNIT_ASSERT_MESSAGE("ensure on duplicate", 180 m4id.Second.getLength() && !(m4id == id1)); 181 182 MockMetadatable mc1(*pRegClip, true); // in clipboard 183 MockMetadatable mc2(*pRegClip, true); 184 MockMetadatable mc3(*pRegClip, true); 185 MockMetadatable mc4(*pRegClip, true); 186 MockMetadatable m2p(*pReg); 187 MockMetadatable m3p(*pReg); 188 189 mc1.SetMetadataReference(id2); 190 CPPUNIT_ASSERT_MESSAGE("set failed", mc1.GetMetadataReference() == id2); 191 try { 192 mc2.SetMetadataReference(id2); 193 CPPUNIT_FAIL("set duplicate succeeded"); 194 } catch (lang::IllegalArgumentException) { } 195 mc1.SetMetadataReference(id2); 196 CPPUNIT_ASSERT_MESSAGE("set failed (existing)", 197 mc1.GetMetadataReference() == id2); 198 mc1.EnsureMetadataReference(); 199 CPPUNIT_ASSERT_MESSAGE("ensure failed (existing)", 200 mc1.GetMetadataReference() == id2); 201 mc2.EnsureMetadataReference(); 202 beans::StringPair mc2id(mc2.GetMetadataReference()); 203 CPPUNIT_ASSERT_MESSAGE("ensure failed", mc2id.Second.getLength()); 204 mc2.EnsureMetadataReference(); 205 CPPUNIT_ASSERT_MESSAGE("ensure failed (idempotent)", 206 mc2.GetMetadataReference() == mc2id); 207 mc2.RemoveMetadataReference(); 208 CPPUNIT_ASSERT_MESSAGE("remove failed", 209 !mc2.GetMetadataReference().Second.getLength()); 210 211 // set up mc2 as copy of m2 and mc3 as copy of m3 212 mc3.RegisterAsCopyOf(m3); 213 CPPUNIT_ASSERT_MESSAGE("copy to clipboard (latent)", 214 !mc3.GetMetadataReference().Second.getLength() ); 215 mc2.RegisterAsCopyOf(m2); 216 CPPUNIT_ASSERT_MESSAGE("copy to clipboard (non-latent)", 217 mc2.GetMetadataReference() == id1); 218 // paste mc2 to m2p and mc3 to m3p 219 m2p.RegisterAsCopyOf(mc2); 220 CPPUNIT_ASSERT_MESSAGE("paste from clipboard (non-latent)", 221 !m2p.GetMetadataReference().Second.getLength() ); 222 m3p.RegisterAsCopyOf(mc3); 223 CPPUNIT_ASSERT_MESSAGE("paste from clipboard (latent)", 224 !m3p.GetMetadataReference().Second.getLength() ); 225 // delete m2, m2p, m3 226 m2.RemoveMetadataReference(); 227 CPPUNIT_ASSERT_MESSAGE("remove failed", 228 !m2.GetMetadataReference().Second.getLength()); 229 CPPUNIT_ASSERT_MESSAGE("paste-remove (non-latent)", 230 m2p.GetMetadataReference() == id1); 231 m2p.RemoveMetadataReference(); 232 CPPUNIT_ASSERT_MESSAGE("remove failed", 233 !m2p.GetMetadataReference().Second.getLength()); 234 CPPUNIT_ASSERT_MESSAGE("paste-remove2 (non-latent)", 235 m3.GetMetadataReference() == id1); 236 m3.RemoveMetadataReference(); 237 CPPUNIT_ASSERT_MESSAGE("remove failed", 238 !m3.GetMetadataReference().Second.getLength()); 239 CPPUNIT_ASSERT_MESSAGE("paste-remove (latent)", 240 m3p.GetMetadataReference() == id1); 241 // delete mc2 242 mc2.SetMetadataReference(beans::StringPair()); 243 CPPUNIT_ASSERT_MESSAGE("in clipboard becomes non-latent", 244 !mc3.GetMetadataReference().Second.getLength() ); 245 // paste mc2 246 m2p.RegisterAsCopyOf(mc2); 247 CPPUNIT_ASSERT_MESSAGE("remove-paste", 248 !m2p.GetMetadataReference().Second.getLength()); 249 CPPUNIT_ASSERT_MESSAGE("remove-paste (stolen)", 250 m3p.GetMetadataReference() == id1); 251 252 // auto-detect stream 253 m5.SetMetadataReference(id3e); 254 CPPUNIT_ASSERT_MESSAGE("auto-detect (content)", 255 m5.GetMetadataReference() == id3); 256 m5.m_bInContent = false; 257 m5.SetMetadataReference(id4e); 258 CPPUNIT_ASSERT_MESSAGE("auto-detect (styles)", 259 m5.GetMetadataReference() == id4); 260 261 OSL_TRACE("sfx2::Metadatable test(): finished\n"); 262 } 263 264 265 CPPUNIT_TEST_SUITE_REGISTRATION(MetadatableTest); 266 267 } 268 269 CPPUNIT_PLUGIN_IMPLEMENT(); 270 271