/*
 * 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.
 */

<'test'='http://www.apache.org/jackrabbit/test'>

[test:canAddChildNode]
  + testChildWithDefaultType (nt:base) = nt:base
  + testChildWithoutDefaultType (nt:base)

[test:canSetProperty]
  - BinaryMultipleConstraints (binary) multiple nofulltext noqueryorder < '(,100)'
  - Boolean (boolean) nofulltext noqueryorder
  - DateConstraints (date) nofulltext noqueryorder < '(1974-02-15T00:00:00.000Z,)'
  - NameConstraints (name) nofulltext noqueryorder < 'abc'
  - LongMultipleConstraints (long) multiple nofulltext noqueryorder < '(,100)'
  - ReferenceMultipleConstraints (reference) multiple nofulltext noqueryorder < 'test:canSetProperty'
  - StringMultiple (string) multiple nofulltext noqueryorder
  - DoubleMultiple (double) multiple nofulltext noqueryorder
  - DoubleConstraints (double) nofulltext noqueryorder < '(100,)'
  - BinaryConstraints (binary) nofulltext noqueryorder < '(,100)'
  - PathMultiple (path) multiple nofulltext noqueryorder
  - Path (path) nofulltext noqueryorder
  - StringMultipleConstraints (string) multiple nofulltext noqueryorder < 'abc', 'def', 'ghi'
  - PathMultipleConstraints (path) multiple nofulltext noqueryorder < '/abc'
  - DateMultiple (date) multiple nofulltext noqueryorder
  - Binary (binary) nofulltext noqueryorder
  - LongMultiple (long) multiple nofulltext noqueryorder
  - LongConstraints (long) nofulltext noqueryorder < '(100,)'
  - BooleanConstraints (boolean) nofulltext noqueryorder < 'true'
  - BinaryMultiple (binary) multiple nofulltext noqueryorder
  - Long (long) nofulltext noqueryorder
  - StringConstraints (string) nofulltext noqueryorder < 'abc', 'def', 'ghi'
  - Date (date) nofulltext noqueryorder
  - ReferenceConstraints (reference) nofulltext noqueryorder < 'test:canSetProperty'
  - Double (double) nofulltext noqueryorder
  - NameMultipleConstraints (name) multiple nofulltext noqueryorder < 'abc'
  - BooleanMultiple (boolean) multiple nofulltext noqueryorder
  - Name (name) nofulltext noqueryorder
  - PathConstraints (path) nofulltext noqueryorder < '/abc'
  - String (string) nofulltext noqueryorder
  - NameMultiple (name) multiple nofulltext noqueryorder
  - BooleanMultipleConstraints (boolean) multiple nofulltext noqueryorder < 'true'
  - DateMultipleConstraints (date) multiple nofulltext noqueryorder < '(,1974-02-15T00:00:00.000Z)'
  - DoubleMultipleConstraints (double) multiple nofulltext noqueryorder < '(,100)'

[test:refTargetNode] > mix:versionable
  - * (undefined) nofulltext noqueryorder

[test:sameNameSibsFalseChildNodeDefinition]
  - * (undefined) nofulltext noqueryorder
  + * (nt:base) = test:sameNameSibsFalseChildNodeDefinition compute

[test:setProperty] > mix:referenceable
  - test:multiProperty (undefined) multiple nofulltext noqueryorder
  - * (undefined) nofulltext noqueryorder
  + * (nt:base) = test:setProperty

[test:setPropertyAssumingType]
  - test:multiProperty (undefined) multiple nofulltext noqueryorder
  - test:singleProperty (undefined) nofulltext noqueryorder
  + * (nt:base) = test:setPropertyAssumingType

[test:versionable] > mix:versionable
  - test:initializeOnParentVersionProp (string) initialize nofulltext noqueryorder
  - test:copyOnParentVersionProp (string) nofulltext noqueryorder
  - test:abortOnParentVersionProp (string) abort nofulltext noqueryorder
  - test:ignoreOnParentVersionProp (string) ignore nofulltext noqueryorder
  - test:computeOnParentVersionProp (string) compute nofulltext noqueryorder
  - test:versionOnParentVersionProp (string) version nofulltext noqueryorder
  - * (undefined) nofulltext noqueryorder
  + test:computeOnParentVersion (nt:base) = nt:unstructured compute
  + test:initializeOnParentVersion (nt:base) = nt:unstructured initialize
  + test:versionOnParentVersion (nt:base) = nt:unstructured version
  + * (nt:base) = test:versionable
  + test:ignoreOnParentVersion (nt:base) = nt:unstructured ignore
  + test:abortOnParentVersion (nt:base) = nt:unstructured abort
  + test:copyOnParentVersion (nt:base) = nt:unstructured

[test:orderableFolder] > nt:folder orderable
  + * (nt:base) = test:orderableFolder

[test:autoCreate]
  - test:property (String) = 'default value' autocreated
  - test:propertyMulti (String) = 'value1', 'value2' autocreated multiple
  + test:folder (nt:folder) = nt:folder autocreated
