Index: jackrabbit-core/src/test/java/org/apache/jackrabbit/core/nodetype/BuiltInNodetypesTest.java
===================================================================
--- jackrabbit-core/src/test/java/org/apache/jackrabbit/core/nodetype/BuiltInNodetypesTest.java	(revision 0)
+++ jackrabbit-core/src/test/java/org/apache/jackrabbit/core/nodetype/BuiltInNodetypesTest.java	(revision 0)
@@ -0,0 +1,147 @@
+/*
+ * 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.core.nodetype;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.jackrabbit.test.JUnitTest;
+import org.apache.jackrabbit.core.nodetype.xml.NodeTypeReader;
+import org.apache.jackrabbit.core.nodetype.compact.CompactNodeTypeDefReader;
+import org.apache.jackrabbit.core.nodetype.compact.ParseException;
+import org.apache.jackrabbit.spi.Name;
+
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.InputStreamReader;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Arrays;
+
+/**
+ * <code>BuiltInNodetypesTest</code>...
+ */
+public class BuiltInNodetypesTest extends JUnitTest {
+
+    private static Logger log = LoggerFactory.getLogger(BuiltInNodetypesTest.class);
+
+    private static final String BUILTIN_CND_FILE = "org/apache/jackrabbit/core/nodetype/builtin_nodetypes.cnd";
+    private static final String BUILTIN_XML_FILE = "org/apache/jackrabbit/core/nodetype/builtin_nodetypes.xml";
+
+    public void testCompareCndXml() throws InvalidNodeTypeDefException, IOException, ParseException {
+        ClassLoader loader = getClass().getClassLoader();
+        InputStream is = loader.getResourceAsStream(BUILTIN_XML_FILE);
+        NodeTypeDef[] xmlDefs = NodeTypeReader.read(is);
+
+        loader = getClass().getClassLoader();
+        Reader reader = new InputStreamReader(loader.getResourceAsStream(BUILTIN_CND_FILE));
+        CompactNodeTypeDefReader cndR = new CompactNodeTypeDefReader(reader, "test");
+
+        List cndDefs = cndR.getNodeTypeDefs();
+
+        List failed = new ArrayList();
+        for (int i = 0; i < xmlDefs.length; i++) {
+            NodeTypeDef def = xmlDefs[i];
+            if (cndDefs.remove(def)) {
+                log.debug("Nodetype definition " + def.getName() + " present both in xml and cnd.");
+            } else {
+                failed.add(def.getName());
+            }
+        }
+
+        if (!(failed.isEmpty() && cndDefs.isEmpty())) {
+            StringBuffer onlyXML = new StringBuffer();
+            StringBuffer onlyCND = new StringBuffer();
+            StringBuffer different = new StringBuffer();
+
+            StringBuffer diff = new StringBuffer();
+
+            for (Iterator it = cndDefs.iterator(); it.hasNext(); ) {
+                NodeTypeDef d = (NodeTypeDef) it.next();
+                if (failed.remove(d.getName())) {
+                    different.append(d.getName()).append(", ");
+                    for (int i = 0; i < xmlDefs.length; i++) {
+                        if (xmlDefs[i].getName().equals(d.getName())) {
+                            diff(d, xmlDefs[i], diff);
+                            break;
+                        }
+                    }
+                } else {
+                    onlyCND.append(d.getName()).append(", ");
+                }
+            }
+            for (Iterator it = failed.iterator(); it.hasNext();) {
+                onlyXML.append(it.next().toString()).append(", ");
+            }
+
+
+            fail("Mismatch between builtin XML and CND node type definitions:" +
+                    "\r- only CND: " + onlyCND.toString() +
+                    "\r- only XML: " + onlyXML.toString() +
+                    "\r- different: " + different.toString()+
+                    "\r\rDIFFEFERENCES\r" + diff.toString());
+        }
+    }
+
+    private static void diff(NodeTypeDef a, NodeTypeDef b, StringBuffer diff) {
+        diff.append("Nodetype = ").append(a.getName());
+        // diff copied from NodeTypeDef.equals:
+        if (!(a.getName() == null ? b.getName() == null : a.getName().equals(b.getName()))) {
+            diff.append("\r\tName: ").append(a.getName()).append(" | ").append(b.getName());
+        }
+
+        if (!(a.getPrimaryItemName() == null ? b.getPrimaryItemName() == null : a.getPrimaryItemName().equals(b.getPrimaryItemName()))) {
+            diff.append("\r\tPrimaryItem: ").append(a.getPrimaryItemName()).append(" | ").append(b.getPrimaryItemName());
+        }
+
+        if (!Arrays.equals(a.getSupertypes(), b.getSupertypes())) {
+            diff.append("\r\tSuperTypes: ").append(getLocalNames(a.getSupertypes())).append(" | ").append(getLocalNames(b.getSupertypes()));
+        }
+
+        if (a.isMixin() != b.isMixin()) {
+            diff.append("\r\tisMixin:" ).append(a.isMixin()).append(" | ").append(b.isMixin());
+        }
+
+        if (a.hasOrderableChildNodes() != b.hasOrderableChildNodes()) {
+            diff.append("\r\thasOrderableChildNodes:" ).append(a.hasOrderableChildNodes()).append(" | ").append(b.hasOrderableChildNodes());
+        }
+
+        if (a.isAbstract() != b.isAbstract()) {
+            diff.append("\r\tisAbstract:" ).append(a.isAbstract()).append(" | ").append(b.isAbstract());
+        }
+
+        if (!Arrays.equals(a.getPropertyDefs(), b.getPropertyDefs())) {
+            diff.append("\r\tgetPropertyDefs:" ).append(a.getPropertyDefs()).append(" | ").append(b.getPropertyDefs());
+        }
+
+        if (!Arrays.equals(a.getChildNodeDefs(), b.getChildNodeDefs())) {
+            diff.append("\r\tgetChildNodeDefs:" ).append(a.getChildNodeDefs()).append(" | ").append(b.getChildNodeDefs());
+        }
+        diff.append("\r\r\r");
+    }
+
+    private static String getLocalNames(Name[] names) {
+        StringBuffer b = new StringBuffer("{");
+        for (int i = 0; i < names.length; i++) {
+            if (i != 0) b.append(",");
+            b.append(names[i].getLocalName());
+        }
+        b.append("}");
+        return b.toString();
+    }
+}
\ No newline at end of file

Property changes on: jackrabbit-core\src\test\java\org\apache\jackrabbit\core\nodetype\BuiltInNodetypesTest.java
___________________________________________________________________
Name: svn:keywords
   + author date id revision url
Name: svn:eol-style
   + native

