You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by md...@apache.org on 2012/03/28 15:22:35 UTC

svn commit: r1306311 - in /jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/state: ./ ChangeLogTest.java

Author: mduerig
Date: Wed Mar 28 13:22:35 2012
New Revision: 1306311

URL: http://svn.apache.org/viewvc?rev=1306311&view=rev
Log:
add test cases for ChangeLog

Added:
    jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/state/
    jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/state/ChangeLogTest.java

Added: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/state/ChangeLogTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/state/ChangeLogTest.java?rev=1306311&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/state/ChangeLogTest.java (added)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/state/ChangeLogTest.java Wed Mar 28 13:22:35 2012
@@ -0,0 +1,413 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.oak.jcr.state;
+
+import org.apache.jackrabbit.mk.model.AbstractPropertyState;
+import org.apache.jackrabbit.mk.model.PropertyState;
+import org.apache.jackrabbit.mk.model.Scalar;
+import org.apache.jackrabbit.mk.model.ScalarImpl;
+import org.apache.jackrabbit.oak.jcr.util.Path;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class ChangeLogTest {
+    private final ChangeLog changeLog = new ChangeLog();
+
+    @Test
+    public void empty() {
+        assertTrue(changeLog.toJsop().isEmpty());
+    }
+    
+    @Test
+    public void singleton() {
+        changeLog.clear();
+        changeLog.addNode(path("/foo"));
+        assertEquals("+\"//foo\":{}", changeLog.toJsop());
+
+        changeLog.clear();
+        changeLog.moveNode(path("/a"), path("/a"));
+        assertTrue(changeLog.toJsop().isEmpty());
+    }
+
+    @Test
+    public void tuples() {
+        changeLog.clear();
+        changeLog.moveNode(path("/a"), path("/b"));
+        changeLog.moveNode(path("/c"), path("/d"));
+        assertEquals(">\"//c\":\"//d\">\"//a\":\"//b\"", changeLog.toJsop());
+
+        changeLog.clear();
+        changeLog.moveNode(path("/a"), path("/b"));
+        changeLog.moveNode(path("/b"), path("/c"));
+        assertEquals(">\"//a\":\"//c\"", changeLog.toJsop());
+
+        changeLog.clear();
+        changeLog.moveNode(path("/a"), path("/b"));
+        changeLog.moveNode(path("/b"), path("/a"));
+        assertTrue(changeLog.toJsop().isEmpty());
+
+        changeLog.clear();
+        changeLog.addNode(path("/a"));
+        changeLog.moveNode(path("/a"), path("/b"));
+        assertEquals("+\"//b\":{}", changeLog.toJsop());
+
+        changeLog.clear();
+        changeLog.moveNode(path("/a"), path("/b"));
+        changeLog.removeNode(path("/b"));
+        assertEquals("-\"//a\"", changeLog.toJsop());
+
+        changeLog.clear();
+        changeLog.addNode(path("/a"));
+        changeLog.removeNode(path("/a"));
+        assertTrue(changeLog.toJsop().isEmpty());
+    }
+
+    @Test
+    public void triple() {
+        changeLog.clear();
+        changeLog.moveNode(path("/a"), path("/b"));
+        changeLog.moveNode(path("/b"), path("/c"));
+        changeLog.moveNode(path("/c"), path("/d"));
+        assertEquals(">\"//a\":\"//d\"", changeLog.toJsop());
+
+        changeLog.clear();
+        changeLog.moveNode(path("/a"), path("/b"));
+        changeLog.moveNode(path("/x"), path("/y"));
+        changeLog.moveNode(path("/b"), path("/c"));
+        assertEquals(">\"//a\":\"//c\">\"//x\":\"//y\"", changeLog.toJsop());
+    }
+    
+    @Test
+    public void remove() {
+        changeLog.clear();
+        changeLog.removeNode(path("/a/b"));
+        changeLog.removeNode(path("/a"));
+        assertEquals("-\"//a\"", changeLog.toJsop());
+    }
+
+    @Test
+    public void removeAdded() {
+        changeLog.clear();
+        changeLog.addNode(path("/a"));
+        changeLog.addNode(path("/a/b"));
+        changeLog.removeNode(path("/a"));
+        assertTrue(changeLog.toJsop().isEmpty());
+
+        changeLog.clear();
+        changeLog.addNode(path("/a"));
+        changeLog.addNode(path("/a/b"));
+        changeLog.addNode(path("/a/c"));
+        changeLog.removeNode(path("/a"));
+        assertTrue(changeLog.toJsop().isEmpty());
+    }
+    
+    @Test
+    public void properties() {
+        changeLog.clear();
+        changeLog.setProperty(path("/"), state("a", 42));
+        assertEquals("^\"//a\":42", changeLog.toJsop());
+
+        changeLog.clear();
+        changeLog.setProperty(path("/"), state("a", 42));
+        changeLog.setProperty(path("/"), state("a", 43));
+        assertEquals("^\"//a\":43", changeLog.toJsop());
+
+        changeLog.clear();
+        changeLog.addNode(path("/a"));
+        changeLog.setProperty(path("/a"), state("a", 42));
+        changeLog.removeNode(path("/a"));
+        assertTrue(changeLog.toJsop().isEmpty());
+
+        changeLog.clear();
+        changeLog.addNode(path("/a"));
+        changeLog.setProperty(path("/a"), state("a", 42));
+        changeLog.setProperty(path("/a"), state("b", 42));
+        changeLog.removeNode(path("/a"));
+        assertTrue(changeLog.toJsop().isEmpty());
+
+        changeLog.clear();
+        changeLog.setProperty(path("/"), state("a", 42));
+        changeLog.removeProperty(path("/"), "a");
+        assertEquals("^\"//a\":null", changeLog.toJsop());
+    }
+
+    /**
+     * 1.   >/a:/b >/c:/d     =  >/c:/d >/a:b
+     * 5.   >/a:/b >/c:/d     =  >/c:/d >/a:b
+     * 9.   >/a:/b >/c:/d     =  >/c:/d >/a:b
+     * 13:  >/a:/b >/c:/d     =  >/c:/d >/a:b
+     */
+    @Test
+    public void testRule1_5_9_13() {
+        changeLog.clear();
+        changeLog.moveNode(path("/a"), path("/b"));
+        changeLog.moveNode(path("/c"), path("/d"));
+        assertEquals(">\"//c\":\"//d\">\"//a\":\"//b\"", changeLog.toJsop());
+    }
+
+    /**
+     * 2.   >/a:/b >/a/b:/c      illegal
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testRule2() {
+        changeLog.clear();
+        changeLog.moveNode(path("/a"), path("/b"));
+        changeLog.moveNode(path("/a/b"), path("/c"));
+    }
+
+    /**
+     * 3.   >/a:/b >/a:/c        illegal
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testRule3() {
+        changeLog.clear();
+        changeLog.moveNode(path("/a"), path("/b"));
+        changeLog.moveNode(path("/a"), path("/c"));
+    }
+
+    /**
+     * 4.   >/a/b:/c >/a:/d   =  >/a:/d >/d/b:/c
+     */
+    @Test
+    public void testRule4() {
+        changeLog.clear();
+        changeLog.moveNode(path("/a/b"), path("/c"));
+        changeLog.moveNode(path("/a"), path("/d"));
+        assertEquals(">\"//a\":\"//d\">\"//d/b\":\"//c\"", changeLog.toJsop());
+
+    }
+
+    /**
+     * 4.   >/a/b:/c >/a:/c/d    does not commute  (q < s)
+     */
+    @Test
+    public void testRule4a() {
+        changeLog.clear();
+        changeLog.moveNode(path("/a/b"), path("/c"));
+        changeLog.moveNode(path("/a"), path("/c/d"));
+        assertEquals(">\"//a/b\":\"//c\">\"//a\":\"//c/d\"", changeLog.toJsop());
+
+    }
+
+    /**
+     * 4'.  -/a/b -/a         =  -/a               (s = NIL and q = NIL)
+     */
+    @Test
+    public void testRule4b() {
+        changeLog.clear();
+        changeLog.removeNode(path("/a/b"));
+        changeLog.removeNode(path("/a"));
+        assertEquals("-\"//a\"", changeLog.toJsop());
+
+    }
+
+    /**
+     * 4'.  >/a/b:/c -/a      =  does not commute  (s = NIL)
+     */
+    @Test
+    public void testRule4c() {
+        changeLog.clear();
+        changeLog.moveNode(path("/a/b"), path("/c"));
+        changeLog.removeNode(path("/a"));
+        assertEquals(">\"//a/b\":\"//c\"-\"//a\"", changeLog.toJsop());
+
+    }
+
+    /**
+     * 6.   >/a:/b >/c:/a/d      illegal
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testRule6() {
+        changeLog.clear();
+        changeLog.moveNode(path("/a"), path("/b"));
+        changeLog.moveNode(path("/c"), path("/a/d"));
+    }
+
+    /**
+     * 7.   >/a:/b >/c:/a        does not commute
+     */
+    @Test
+    public void testRule7() {
+        changeLog.clear();
+        changeLog.moveNode(path("/a"), path("/b"));
+        changeLog.moveNode(path("/c"), path("/a"));
+        assertEquals(">\"//a\":\"//b\">\"//c\":\"//a\"", changeLog.toJsop());
+    }
+
+    /**
+     * 8.   >/a/d:/b >/c:/a      illegal
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testRule8() {
+        changeLog.clear();
+        changeLog.moveNode(path("/a/d"), path("/b"));
+        changeLog.moveNode(path("/c"), path("/a"));
+    }
+
+    /**
+     * 10.  >/a:/b >/b/c:/d   =  >/a/c:/d >/a:/b
+     */
+    @Test
+    public void testRule10() {
+        changeLog.clear();
+        changeLog.moveNode(path("/a"), path("/b"));
+        changeLog.moveNode(path("/b/c"), path("/d"));
+        assertEquals(">\"//a/c\":\"//d\">\"//a\":\"//b\"", changeLog.toJsop());
+    }
+
+    /**
+     * 10'. +/b:{} >/b/c:/d      illegal
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testRule10a() {
+        changeLog.clear();
+        changeLog.addNode(path("/b"));
+        changeLog.moveNode(path("/b/c"), path("/d"));
+    }
+
+    /**
+     * 11.  >/a:/b >/b:/c     =  >/a:/c
+     */
+    @Test
+    public void testRule11() {
+        changeLog.clear();
+        changeLog.moveNode(path("/a"), path("/b"));
+        changeLog.moveNode(path("/b"), path("/c"));
+        assertEquals(">\"//a\":\"//c\"", changeLog.toJsop());
+    }
+
+    /**
+     * 12.  >/a:/b/c >/b:/d   =  >/b:/d >/a:/d/c
+     */
+    @Test
+    public void testRule12() {
+        changeLog.clear();
+        changeLog.moveNode(path("/a"), path("/b/c"));
+        changeLog.moveNode(path("/b"), path("/d"));
+        assertEquals(">\"//b\":\"//d\">\"//a\":\"//d/c\"", changeLog.toJsop());
+    }
+
+    /**
+     * 12'. >/a:/b/c -/b      =  -/b -/a = -/a -/b
+     */
+    @Test
+    public void testRule12a() {
+        changeLog.clear();
+        changeLog.moveNode(path("/a"), path("/b/c"));
+        changeLog.removeNode(path("/b"));
+        assertEquals("-\"//a\"-\"//b\"", changeLog.toJsop());
+    }
+
+    /**
+     * 14.  >/a:/b >/c:/b/d   =  >/c:/a/d >/a:/b
+     */
+    @Test
+    public void testRule14() {
+        changeLog.clear();
+        changeLog.moveNode(path("/a"), path("/b"));
+        changeLog.moveNode(path("/c"), path("/b/d"));
+        assertEquals(">\"//c\":\"//a/d\">\"//a\":\"//b\"", changeLog.toJsop());
+    }
+
+    /**
+     * 14.  >/a/b:/b >/a:/b/d    does not commute  (p > r)
+     */
+    @Test
+    public void testRule14a() {
+        changeLog.clear();
+        changeLog.moveNode(path("/a/b"), path("/b"));
+        changeLog.moveNode(path("/a"), path("/b/d"));
+        assertEquals(">\"//a/b\":\"//b\">\"//a\":\"//b/d\"", changeLog.toJsop());
+    }
+
+    /**
+     * 14'. +/b:{} >/c:/b/c      does not commute  (parent of s = q and p = NIL)
+     */
+    @Test
+    public void testRule14b() {
+        changeLog.clear();
+        changeLog.addNode(path("/b"));
+        changeLog.moveNode(path("/c"), path("/b/c"));
+        assertEquals("+\"//b\":{}>\"//c\":\"//b/c\"", changeLog.toJsop());
+    }    
+    
+    /**
+     * 14'. +/b:{} >/c:/b/c/d    illegal           (p = NIL)
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testRule14c() {
+        changeLog.clear();
+        changeLog.addNode(path("/b"));
+        changeLog.moveNode(path("/c"), path("/b/c/d"));
+    }
+
+    /**
+     * 15.  >/a:/b >/c:/b        illegal
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testRule15() {
+        changeLog.clear();
+        changeLog.moveNode(path("/a"), path("/b"));
+        changeLog.moveNode(path("/c"), path("/b"));
+    }
+
+    /**
+     * 16.  >/a:/b/d >/c:/b      illegal
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testRule16() {
+        changeLog.clear();
+        changeLog.moveNode(path("/a"), path("/b/d"));
+        changeLog.moveNode(path("/c"), path("/b"));
+    }
+
+    //------------------------------------------< private >---
+
+    private static Path path(String path) {
+        return Path.create("", path);
+    }
+
+    private static PropertyState state(final String name, final int value) {
+        return new AbstractPropertyState() {
+            @Override
+            public String getName() {
+                return name;
+            }
+
+            @Override
+            public boolean isArray() {
+                return false; 
+            }
+
+            @Override
+            public Scalar getScalar() {
+                return ScalarImpl.longScalar(value);
+            }
+
+            @Override
+            public Iterable<Scalar> getArray() {
+                return null; 
+            }
+        };
+    }
+
+}