Package org.waveprotocol.wave.model.experimental.schema

Source Code of org.waveprotocol.wave.model.experimental.schema.SchemaFactoryTest

/**
* 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.waveprotocol.wave.model.experimental.schema;


import junit.framework.TestCase;

import org.waveprotocol.wave.model.document.operation.Attributes;
import org.waveprotocol.wave.model.document.operation.AttributesUpdate;
import org.waveprotocol.wave.model.document.operation.impl.AttributesImpl;
import org.waveprotocol.wave.model.document.operation.impl.AttributesUpdateImpl;
import org.waveprotocol.wave.model.experimental.schema.AttributeValidationResult.AttributeNotAllowed;
import org.waveprotocol.wave.model.experimental.schema.AttributeValidationResult.InvalidAttributeValue;
import org.waveprotocol.wave.model.experimental.schema.AttributeValidationResult.MissingRequiredAttribute;
import org.waveprotocol.wave.model.experimental.schema.AttributeValidationResult.RemovingRequiredAttribute;
import org.waveprotocol.wave.model.experimental.schema.AttributeValidationResult.Type;
import org.waveprotocol.wave.model.experimental.schema.DocInitializationParser.ParseException;
import org.waveprotocol.wave.model.experimental.schema.SchemaPattern.Prologue;

import java.io.IOException;
import java.io.InputStream;

/**
* Tests for SchemaPattern.
*
*/

public class SchemaFactoryTest extends TestCase {

  private static final Attributes SAMPLE_ATTRIBUTES =
      new AttributesImpl(
          "name1", "value1",
          "name2", "value2");

  private static final AttributesUpdate SAMPLE_ATTRIBUTES_UPDATE =
      new AttributesUpdateImpl(
          "name1", "oldValue1", "newValue1",
          "name2", null, "newValue2",
          "name3", "oldValue3", null);

  /**
   * Tests a schema featuring elements and prologues.
   */
  public void testGoodSchema1() throws InvalidSchemaException, IOException, ParseException {
    SchemaPattern test = readSchema("good1.schema");
    assertEquals(0, test.prologue().size());
    checkValidation_ANA(test.validateAttributes(SAMPLE_ATTRIBUTES), "name1");
    checkValidation_ANA(test.validateAttributesUpdate(SAMPLE_ATTRIBUTES_UPDATE), "name1");
    assertEquals(0, test.validateCharacters("abcd"));
    assertNull(test.child("bad"));
    SchemaPattern test_prologueTest = test.child("prologueTest");
    Prologue test_prologueTest_prologue = test_prologueTest.prologue();
    assertEquals(3, test_prologueTest_prologue.size());
    assertEquals("element1", test_prologueTest_prologue.get(0).elementType());
    assertEquals("element2", test_prologueTest_prologue.get(1).elementType());
    assertEquals("element3", test_prologueTest_prologue.get(2).elementType());
    SchemaPattern test_prologueTest_prologue0 = test_prologueTest_prologue.get(0).pattern();
    assertEquals(0, test_prologueTest_prologue0.prologue().size());
    checkValidation_ANA(test_prologueTest_prologue0.validateAttributes(SAMPLE_ATTRIBUTES), "name1");
    checkValidation_ANA(test_prologueTest_prologue0.validateAttributesUpdate(
        SAMPLE_ATTRIBUTES_UPDATE), "name1");
    assertEquals(0, test_prologueTest_prologue0.validateCharacters("abcd"));
    assertNull(test_prologueTest_prologue0.child("bad"));
    SchemaPattern test_prologueTest_prologue1 = test_prologueTest_prologue.get(1).pattern();
    checkEmptyPattern(test_prologueTest_prologue1);
    SchemaPattern test_prologueTest_prologue2 = test_prologueTest_prologue.get(2).pattern();
    Prologue test_prologueTest_prologue2_prologue = test_prologueTest_prologue2.prologue();
    assertEquals(2, test_prologueTest_prologue2_prologue.size());
    assertEquals("element7", test_prologueTest_prologue2_prologue.get(0).elementType());
    assertEquals("element8", test_prologueTest_prologue2_prologue.get(1).elementType());
    checkValidation_ANA(test_prologueTest_prologue2.validateAttributes(SAMPLE_ATTRIBUTES), "name1");
    checkValidation_ANA(test_prologueTest_prologue2.validateAttributesUpdate(
        SAMPLE_ATTRIBUTES_UPDATE), "name1");
    assertEquals(0, test_prologueTest_prologue2.validateCharacters("abcd"));
    assertNull(test_prologueTest_prologue2.child("bad"));
    checkEmptyPattern(test_prologueTest_prologue0.child("element4"));
    checkEmptyPattern(test_prologueTest_prologue2_prologue.get(0).pattern());
    checkEmptyPattern(test_prologueTest_prologue2_prologue.get(1).pattern());
    checkEmptyPattern(test_prologueTest_prologue2.child("element5"));
    checkEmptyPattern(test_prologueTest_prologue2.child("element6"));
  }

  /**
   * Tests a schema featuring attributes.
   */
  public void testGoodSchema2() throws InvalidSchemaException, IOException, ParseException {
    SchemaPattern test = readSchema("good2.schema");

    /*
     * Test a pattern containing a single non-required attribute whose only
     * allowed value is a fixed string.
     */
    SchemaPattern test_element1 = test.child("element1");
    checkValidation_ANA(test_element1.validateAttributes(new AttributesImpl(
        "bad", "value1")),
        "bad");
    checkValidation_IAV(test_element1.validateAttributes(new AttributesImpl(
        "attribute1", "bad")),
        "attribute1", "bad");
    checkValidation_V(test_element1.validateAttributes(new AttributesImpl(
        "attribute1", "value1")));
    checkValidation_V(test_element1.validateAttributes(AttributesImpl.EMPTY_MAP));
    checkValidation_ANA(test_element1.validateAttributes(new AttributesImpl(
        "attribute1", "value1",
        "bad", "bad")),
        "bad");
    checkValidation_ANA(test_element1.validateAttributesUpdate(new AttributesUpdateImpl(
        "bad", "value1", "value1")),
        "bad");
    checkValidation_IAV(test_element1.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute1", "bad", "bad")),
        "attribute1", "bad");
    checkValidation_V(test_element1.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute1", "value1", "value1")));
    checkValidation_V(test_element1.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute1", null, "value1")));
    checkValidation_V(test_element1.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute1", "value1", null)));
    checkValidation_V(test_element1.validateAttributesUpdate(AttributesUpdateImpl.EMPTY_MAP));
    checkValidation_ANA(test_element1.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute1", "value1", "value1",
        "bad", "bad", "bad")),
        "bad");

    /*
     * Test a pattern containing a single non-required attribute with an
     * infinite number of possible values matching a regular expression.
     */
    SchemaPattern test_element2 = test.child("element2");
    checkValidation_ANA(test_element2.validateAttributes(new AttributesImpl(
        "bad", "abbbc")),
        "bad");
    checkValidation_IAV(test_element2.validateAttributes(new AttributesImpl(
        "attribute2", "bad")),
        "attribute2", "bad");
    checkValidation_V(test_element2.validateAttributes(new AttributesImpl(
        "attribute2", "abbbc")));
    checkValidation_ANA(test_element2.validateAttributesUpdate(new AttributesUpdateImpl(
        "bad", "abbbc", "abbbc")),
        "bad");
    checkValidation_IAV(test_element2.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute2", "bad", "bad")),
        "attribute2", "bad");
    checkValidation_V(test_element2.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute2", "abbbc", "abbbc")));
    checkValidation_V(test_element2.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute2", null, "abbbc")));
    checkValidation_V(test_element2.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute2", "abbbc", null)));

    /*
     * Test a pattern containing a mixture of required and non-required attributes.
     */
    SchemaPattern test_element3 = test.child("element3");
    checkValidation_MRA(test_element3.validateAttributes(new AttributesImpl(
        "bad", "value1")),
        "attribute3");
    checkValidation_ANA(test_element3.validateAttributes(new AttributesImpl(
        "attribute3", "value3",
        "bad", "bad")),
        "bad");
    checkValidation_V(test_element3.validateAttributes(new AttributesImpl(
        "attribute3", "value3")));
    checkValidation_V(test_element3.validateAttributes(new AttributesImpl(
        "attribute3", "value3",
        "attribute4", "value4",
        "attribute5", "value5")));
    checkValidation_IAV(test_element3.validateAttributes(new AttributesImpl(
        "attribute3", "bad",
        "attribute4", "value4",
        "attribute5", "value5")),
        "attribute3", "bad");
    checkValidation_IAV(test_element3.validateAttributes(new AttributesImpl(
        "attribute3", "value3",
        "attribute4", "bad",
        "attribute5", "value5")),
        "attribute4", "bad");
    checkValidation_MRA(test_element3.validateAttributes(new AttributesImpl(
        "attribute4", "value4",
        "attribute5", "value5")),
        "attribute3");
    checkValidation_MRA(test_element3.validateAttributes(AttributesImpl.EMPTY_MAP),
        "attribute3");
    checkValidation_ANA(test_element3.validateAttributesUpdate(new AttributesUpdateImpl(
        "bad", "value1", "value1")),
        "bad");
    checkValidation_ANA(test_element3.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute3", "value3", "value3",
        "bad", "bad", "bad")),
        "bad");
    checkValidation_V(test_element3.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute3", "value3", "value3")));
    checkValidation_RRA(test_element3.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute3", "value3", null)),
        "attribute3");
    checkValidation_V(test_element3.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute3", "value3", "value3",
        "attribute4", "value4", "value4",
        "attribute5", "value5", "value5")));
    checkValidation_IAV(test_element3.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute3", "bad", "bad",
        "attribute4", "value4", "value4",
        "attribute5", "value5", "value5")),
        "attribute3", "bad");
    checkValidation_IAV(test_element3.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute3", "value3", "value3",
        "attribute4", "bad", "bad",
        "attribute5", "value5", "value5")),
        "attribute4", "bad");
    checkValidation_V(test_element3.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute4", "value4", "value4",
        "attribute5", "value5", "value5")));
    checkValidation_V(test_element3.validateAttributesUpdate(AttributesUpdateImpl.EMPTY_MAP));

    /*
     * Test a pattern containing a single required attribute attribute.
     */
    SchemaPattern test_element4 = test.child("element4");
    checkValidation_IAV(test_element4.validateAttributes(new AttributesImpl(
        "attribute6", "xyz")),
        "attribute6", "xyz");
    checkValidation_IAV(test_element4.validateAttributes(new AttributesImpl(
        "attribute6", "axyz")),
        "attribute6", "axyz");
    checkValidation_IAV(test_element4.validateAttributes(new AttributesImpl(
        "attribute6", "xyzb")),
        "attribute6", "xyzb");
    checkValidation_V(test_element4.validateAttributes(new AttributesImpl(
        "attribute6", "axyzb")));
    checkValidation_IAV(test_element4.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute6", "xyz", "xyz")),
        "attribute6", "xyz");
    checkValidation_IAV(test_element4.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute6", "axyz", "axyz")),
        "attribute6", "axyz");
    checkValidation_IAV(test_element4.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute6", "xyzb", "xyzb")),
        "attribute6", "xyzb");
    checkValidation_V(test_element4.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute6", "axyzb", "axyzb")));

    /*
     * Test that the "casting" methods of the result objects returned by the
     * validation behave correctly.
     */
    AttributeValidationResult example_V = test_element3.validateAttributes(
        new AttributesImpl(
            "attribute3", "value3"));
    AttributeValidationResult example_ANA = test_element3.validateAttributes(
        new AttributesImpl(
            "attribute3", "value3",
            "bad", "bad"));
    AttributeValidationResult example_IAV = test_element3.validateAttributes(
        new AttributesImpl(
            "attribute3", "bad"));
    AttributeValidationResult example_MRA = test_element3.validateAttributes(
        AttributesImpl.EMPTY_MAP);
    AttributeValidationResult example_RRA = test_element3.validateAttributesUpdate(
        new AttributesUpdateImpl(
            "attribute3", "value3", null));
    assertNull(example_V.asAttributeNotAllowed());
    assertNull(example_V.asInvalidAttributeValue());
    assertNull(example_V.asMissingRequiredAttribute());
    assertNull(example_V.asRemovingRequiredAttribute());
    assertNotNull(example_ANA.asAttributeNotAllowed());
    assertNull(example_ANA.asInvalidAttributeValue());
    assertNull(example_ANA.asMissingRequiredAttribute());
    assertNull(example_ANA.asRemovingRequiredAttribute());
    assertNull(example_IAV.asAttributeNotAllowed());
    assertNotNull(example_IAV.asInvalidAttributeValue());
    assertNull(example_IAV.asMissingRequiredAttribute());
    assertNull(example_IAV.asRemovingRequiredAttribute());
    assertNull(example_MRA.asAttributeNotAllowed());
    assertNull(example_MRA.asInvalidAttributeValue());
    assertNotNull(example_MRA.asMissingRequiredAttribute());
    assertNull(example_MRA.asRemovingRequiredAttribute());
    assertNull(example_RRA.asAttributeNotAllowed());
    assertNull(example_RRA.asInvalidAttributeValue());
    assertNull(example_RRA.asMissingRequiredAttribute());
    assertNotNull(example_RRA.asRemovingRequiredAttribute());
  }

  /**
   * Tests a schema featuring character data.
   */
  public void testGoodSchema3() throws InvalidSchemaException, IOException, ParseException {
    SchemaPattern test = readSchema("good3.schema");
    SchemaPattern test_element1 = test.child("element1");
    assertEquals(-1, test_element1.validateCharacters("eeeeeeee"));
    assertEquals(-1, test_element1.validateCharacters("ffffffff"));
    assertEquals(-1, test_element1.validateCharacters("efghefgh"));
    assertEquals(0, test_element1.validateCharacters("aaaaaaaa"));
    assertEquals(0, test_element1.validateCharacters("bbbbbbbb"));
    assertEquals(4, test_element1.validateCharacters("efgha"));
    SchemaPattern test_element2 = test.child("element2");
    assertEquals(-1, test_element2.validateCharacters("aaaaaaaa"));
    assertEquals(-1, test_element2.validateCharacters("bbbbbbbb"));
    assertEquals(-1, test_element2.validateCharacters("abcdabcd"));
    assertEquals(0, test_element2.validateCharacters("eeeeeeee"));
    assertEquals(0, test_element2.validateCharacters("ffffffff"));
    assertEquals(4, test_element2.validateCharacters("abcde"));
  }

  /**
   * Tests a schema featuring a top-level prologue.
   */
  public void testGoodSchema4() throws InvalidSchemaException, IOException, ParseException {
    SchemaPattern test = readSchema("good4.schema");
    Prologue test_prologue = test.prologue();
    assertEquals(3, test_prologue.size());
    assertEquals("element1", test_prologue.get(0).elementType());
    assertEquals("element2", test_prologue.get(1).elementType());
    assertEquals("element3", test_prologue.get(2).elementType());
    checkValidation_ANA(test.validateAttributes(SAMPLE_ATTRIBUTES), "name1");
    checkValidation_ANA(test.validateAttributesUpdate(SAMPLE_ATTRIBUTES_UPDATE), "name1");
    assertEquals(0, test.validateCharacters("abcd"));
    assertNull(test.child("bad"));
    SchemaPattern test_prologue0 = test_prologue.get(0).pattern();
    assertEquals(0, test_prologue0.prologue().size());
    checkValidation_ANA(test_prologue0.validateAttributes(SAMPLE_ATTRIBUTES), "name1");
    checkValidation_ANA(test_prologue0.validateAttributesUpdate(SAMPLE_ATTRIBUTES_UPDATE), "name1");
    assertEquals(0, test_prologue0.validateCharacters("abcd"));
    assertNull(test_prologue0.child("bad"));
    SchemaPattern test_prologue1 = test_prologue.get(1).pattern();
    checkEmptyPattern(test_prologue1);
    SchemaPattern test_prologue2 = test_prologue.get(2).pattern();
    Prologue test_prologue2_prologue = test_prologue2.prologue();
    assertEquals(2, test_prologue2_prologue.size());
    assertEquals("element7", test_prologue2_prologue.get(0).elementType());
    assertEquals("element8", test_prologue2_prologue.get(1).elementType());
    checkValidation_ANA(test_prologue2.validateAttributes(SAMPLE_ATTRIBUTES), "name1");
    checkValidation_ANA(test_prologue2.validateAttributesUpdate(SAMPLE_ATTRIBUTES_UPDATE), "name1");
    assertEquals(0, test_prologue2.validateCharacters("abcd"));
    assertNull(test_prologue2.child("bad"));
    checkEmptyPattern(test_prologue0.child("element4"));
    checkEmptyPattern(test_prologue2_prologue.get(0).pattern());
    checkEmptyPattern(test_prologue2_prologue.get(1).pattern());
    checkEmptyPattern(test_prologue2.child("element5"));
    checkEmptyPattern(test_prologue2.child("element6"));
  }

  /**
   * Tests a schema featuring top-level optional attributes.
   */
  public void testGoodSchema5() throws InvalidSchemaException, IOException, ParseException {
    SchemaPattern test = readSchema("good5.schema");
    checkValidation_ANA(test.validateAttributes(new AttributesImpl(
        "bad", "value1")),
        "bad");
    checkValidation_ANA(test.validateAttributes(new AttributesImpl(
        "attribute1", "value1",
        "bad", "bad")),
        "bad");
    checkValidation_V(test.validateAttributes(new AttributesImpl(
        "attribute1", "value1")));
    checkValidation_V(test.validateAttributes(new AttributesImpl(
        "attribute1", "value1",
        "attribute2", "abbbc",
        "attribute3", "axyzb")));
    checkValidation_IAV(test.validateAttributes(new AttributesImpl(
        "attribute1", "bad",
        "attribute2", "abbbc",
        "attribute3", "axyzb")),
        "attribute1", "bad");
    checkValidation_V(test.validateAttributes(AttributesImpl.EMPTY_MAP));
    checkValidation_ANA(test.validateAttributesUpdate(new AttributesUpdateImpl(
        "bad", "value1", "value1")),
        "bad");
    checkValidation_ANA(test.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute1", "value1", "value1",
        "bad", "bad", "bad")),
        "bad");
    checkValidation_V(test.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute1", "value1", "value1")));
    checkValidation_V(test.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute1", "value1", null)));
    checkValidation_V(test.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute1", "value1", "value1",
        "attribute2", "abbbc", "abbbc",
        "attribute3", "axyzb", "axyzb")));
    checkValidation_IAV(test.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute1", "bad", "bad",
        "attribute2", "abbbc", "abbbc",
        "attribute3", "axyzb", "axyzb")),
        "attribute1", "bad");
    checkValidation_V(test.validateAttributesUpdate(AttributesUpdateImpl.EMPTY_MAP));
  }

  /**
   * Tests a schema featuring top-level attributes, including a required attribute.
   */
  public void testGoodSchema6() throws InvalidSchemaException, IOException, ParseException {
    SchemaPattern test = readSchema("good6.schema");
    checkValidation_MRA(test.validateAttributes(new AttributesImpl(
        "bad", "value1")),
        "attribute1");
    checkValidation_ANA(test.validateAttributes(new AttributesImpl(
        "attribute1", "value1",
        "bad", "bad")),
        "bad");
    checkValidation_V(test.validateAttributes(new AttributesImpl(
        "attribute1", "value1")));
    checkValidation_V(test.validateAttributes(new AttributesImpl(
        "attribute1", "value1",
        "attribute2", "abbbc",
        "attribute3", "axyzb")));
    checkValidation_IAV(test.validateAttributes(new AttributesImpl(
        "attribute1", "bad",
        "attribute2", "abbbc",
        "attribute3", "axyzb")),
        "attribute1", "bad");
    checkValidation_IAV(test.validateAttributes(new AttributesImpl(
        "attribute1", "value1",
        "attribute2", "bad",
        "attribute3", "axyzb")),
        "attribute2", "bad");
    checkValidation_MRA(test.validateAttributes(new AttributesImpl(
        "attribute2", "abbbc",
        "attribute3", "axyzb")),
        "attribute1");
    checkValidation_MRA(test.validateAttributes(AttributesImpl.EMPTY_MAP),
        "attribute1");
    checkValidation_ANA(test.validateAttributesUpdate(new AttributesUpdateImpl(
        "bad", "value1", "value1")),
        "bad");
    checkValidation_ANA(test.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute1", "value1", "value1",
        "bad", "bad", "bad")),
        "bad");
    checkValidation_V(test.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute1", "value1", "value1")));
    checkValidation_RRA(test.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute1", "value1", null)),
        "attribute1");
    checkValidation_V(test.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute1", "value1", "value1",
        "attribute2", "abbbc", "abbbc",
        "attribute3", "axyzb", "axyzb")));
    checkValidation_IAV(test.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute1", "bad", "bad",
        "attribute2", "abbbc", "abbbc",
        "attribute3", "axyzb", "axyzb")),
        "attribute1", "bad");
    checkValidation_IAV(test.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute1", "value1", "value1",
        "attribute2", "bad", "bad",
        "attribute3", "axyzb", "axyzb")),
        "attribute2", "bad");
    checkValidation_V(test.validateAttributesUpdate(new AttributesUpdateImpl(
        "attribute2", "abbbc", "abbbc",
        "attribute3", "axyzb", "axyzb")));
    checkValidation_V(test.validateAttributesUpdate(AttributesUpdateImpl.EMPTY_MAP));
  }

  /**
   * Tests a schema featuring top-level character data with blacklisting of characters.
   */
  public void testGoodSchema7() throws InvalidSchemaException, IOException, ParseException {
    SchemaPattern test = readSchema("good7.schema");
    assertEquals(-1, test.validateCharacters("eeeeeeee"));
    assertEquals(-1, test.validateCharacters("ffffffff"));
    assertEquals(-1, test.validateCharacters("efghefgh"));
    assertEquals(0, test.validateCharacters("aaaaaaaa"));
    assertEquals(0, test.validateCharacters("bbbbbbbb"));
    assertEquals(4, test.validateCharacters("efgha"));
  }

  /**
   * Tests a schema featuring top-level character data with whitelisting of characters.
   */
  public void testGoodSchema8() throws InvalidSchemaException, IOException, ParseException {
    SchemaPattern test = readSchema("good8.schema");
    assertEquals(-1, test.validateCharacters("aaaaaaaa"));
    assertEquals(-1, test.validateCharacters("bbbbbbbb"));
    assertEquals(-1, test.validateCharacters("abcdabcd"));
    assertEquals(0, test.validateCharacters("eeeeeeee"));
    assertEquals(0, test.validateCharacters("ffffffff"));
    assertEquals(4, test.validateCharacters("abcde"));
  }

  /**
   * Tests a schema featuring references.
   */
  public void testGoodSchema9() throws InvalidSchemaException, IOException, ParseException {
    SchemaPattern test = readSchema("good9.schema");
    checkValidation_V(test.validateAttributes(new AttributesImpl("attribute1", "value1")));
    checkValidation_V(test.validateAttributes(new AttributesImpl("attribute2", "value2")));
    checkValidation_ANA(test.validateAttributes(new AttributesImpl("bad", "bad")), "bad");
    SchemaPattern test_element1 = test.child("element1");
    assertNull(test_element1.child("bad"));
    assertNotNull(test_element1.child("element4"));
    SchemaPattern test_element2 = test.child("element2");
    assertNull(test_element2.child("bad"));
    assertNotNull(test_element2.child("element4"));
    SchemaPattern test_element3 = test.child("element3");
    assertNull(test_element3.child("element4"));
  }

  /**
   * Tests a schema featuring a nested reference.
   */
  public void testGoodSchema10() throws InvalidSchemaException, IOException, ParseException {
    SchemaPattern test = readSchema("good10.schema");
    SchemaPattern test_element0 = test.child("element0");
    checkValidation_V(test_element0.validateAttributes(new AttributesImpl("attribute1", "value1")));
    checkValidation_V(test_element0.validateAttributes(new AttributesImpl("attribute2", "value2")));
    checkValidation_ANA(test_element0.validateAttributes(new AttributesImpl("bad", "bad")), "bad");
    SchemaPattern test_element0_element1 = test_element0.child("element1");
    assertNull(test_element0_element1.child("bad"));
    assertNotNull(test_element0_element1.child("element4"));
    SchemaPattern test_element0_element2 = test_element0.child("element2");
    assertNull(test_element0_element2.child("bad"));
    assertNotNull(test_element0_element2.child("element4"));
    SchemaPattern test_element0_element3 = test_element0.child("element3");
    assertNull(test_element0_element3.child("element4"));
  }

  /**
   * Tests a schema featuring references involving required attributes.
   */
  public void testGoodSchema11() throws InvalidSchemaException, IOException, ParseException {
    SchemaPattern test = readSchema("good11.schema");
    checkValidation_V(test.validateAttributes(new AttributesImpl(
        "attribute1", "value1",
        "attribute2", "value2",
        "attribute3", "value3",
        "attribute4", "value4")));
    checkValidation_V(test.validateAttributes(new AttributesImpl(
        "attribute1", "value1",
        "attribute3", "value3",
        "attribute4", "value4")));
    checkValidation_V(test.validateAttributes(new AttributesImpl(
        "attribute1", "value1",
        "attribute2", "value2",
        "attribute3", "value3")));
    checkValidation_MRA(test.validateAttributes(new AttributesImpl(
        "attribute2", "value2",
        "attribute3", "value3",
        "attribute4", "value4")),
        "attribute1");
    checkValidation_MRA(test.validateAttributes(new AttributesImpl(
        "attribute1", "value1",
        "attribute2", "value2",
        "attribute4", "value4")),
        "attribute3");
    checkValidation_ANA(test.validateAttributes(new AttributesImpl(
        "attribute1", "value1",
        "attribute2", "value2",
        "attribute3", "value3",
        "attribute4", "value4",
        "bad", "bad")),
        "bad");
  }

  /**
   * Tests a schema featuring references with double indirection.
   */
  public void testGoodSchema12() throws InvalidSchemaException, IOException, ParseException {
    SchemaPattern test = readSchema("good12.schema");
    checkValidation_V(test.validateAttributes(new AttributesImpl("attribute1", "value1")));
    checkValidation_V(test.validateAttributes(new AttributesImpl("attribute2", "value2")));
    checkValidation_V(test.validateAttributes(new AttributesImpl("attribute3", "value3")));
    checkValidation_ANA(test.validateAttributes(new AttributesImpl("bad", "bad")), "bad");
    SchemaPattern test_element1 = test.child("element1");
    assertNull(test_element1.child("bad"));
    assertNotNull(test_element1.child("element4"));
    SchemaPattern test_element2 = test.child("element2");
    assertNull(test_element2.child("bad"));
    assertNotNull(test_element2.child("element5"));
    SchemaPattern test_element3 = test.child("element3");
    assertNull(test_element2.child("bad"));
    assertNotNull(test_element3.child("element6"));
  }

  /**
   * Tests a schema featuring a recursive reference.
   */
  public void testGoodSchema13() throws InvalidSchemaException, IOException, ParseException {
    SchemaPattern test = readSchema("good13.schema");
    for (int i = 0; i < 16; ++i) {
      checkValidation_V(test.validateAttributes(new AttributesImpl("attribute1", "value1")));
      checkValidation_ANA(test.validateAttributes(new AttributesImpl("bad", "bad")), "bad");
      test = test.child("element1");
    }
  }

  /**
   * Tests a schema featuring recursive references.
   */
  public void testGoodSchema14() throws InvalidSchemaException, IOException, ParseException {
    SchemaPattern pattern = readSchema("good14.schema");
    String[] elements = { "element1", "element2", "element3" };
    String[] attributes = { "attribute1", "attribute2", "attribute3" };
    String[] values = { "value1", "value2", "value3" };
    for (int i = 0; i < 16; ++i) {
      int k0 = i % 3;
      int k1 = (i + 1) % 3;
      int k2 = (i + 2) % 3;
      checkValidation_V(pattern.validateAttributes(new AttributesImpl(attributes[k0], values[k0])));
      checkValidation_ANA(
          pattern.validateAttributes(new AttributesImpl(attributes[k1], values[k1])),
          attributes[k1]);
      checkValidation_ANA(
          pattern.validateAttributes(new AttributesImpl(attributes[k2], values[k2])),
          attributes[k2]);
      pattern = pattern.child(elements[i % 3]);
    }
  }

  /**
   * Tests a schema featuring the interleaving of prologues and referenced
   * patterns containing prologues.
   */
  public void testGoodSchema15() throws InvalidSchemaException, IOException, ParseException {
    SchemaPattern test = readSchema("good15.schema");
    Prologue prologue = test.prologue();
    assertEquals(8, test.prologue().size());
    assertEquals("element1", prologue.get(0).elementType());
    assertEquals("element2", prologue.get(1).elementType());
    assertEquals("element5", prologue.get(2).elementType());
    assertEquals("element6", prologue.get(3).elementType());
    assertEquals("element3", prologue.get(4).elementType());
    assertEquals("element4", prologue.get(5).elementType());
    assertEquals("element5", prologue.get(6).elementType());
    assertEquals("element6", prologue.get(7).elementType());
    assertNotNull(prologue.get(0).pattern().child("element7"));
    assertNotNull(prologue.get(1).pattern().child("element8"));
    assertNotNull(prologue.get(2).pattern().child("element11"));
    assertNotNull(prologue.get(3).pattern().child("element12"));
    assertNotNull(prologue.get(4).pattern().child("element9"));
    assertNotNull(prologue.get(5).pattern().child("element10"));
    assertNotNull(prologue.get(6).pattern().child("element11"));
    assertNotNull(prologue.get(7).pattern().child("element12"));
  }

  /**
   * Tests a schema featuring various regular expressions for attribute values.
   */
  public void testGoodSchema16() throws InvalidSchemaException, IOException, ParseException {
    SchemaPattern test = readSchema("good16.schema");
    SchemaPattern pattern = test.child("element1");
    checkValidation_V(pattern.validateAttributes(new AttributesImpl(
        "attribute1", "hello")));
    checkValidation_V(pattern.validateAttributes(new AttributesImpl(
        "attribute1", "world")));
    checkValidation_IAV(pattern.validateAttributes(new AttributesImpl(
        "attribute1", "bad")),
        "attribute1", "bad");
    checkValidation_V(pattern.validateAttributes(new AttributesImpl(
        "attribute2", "abcdgh")));
    checkValidation_V(pattern.validateAttributes(new AttributesImpl(
        "attribute2", "abefgh")));
    checkValidation_IAV(pattern.validateAttributes(new AttributesImpl(
        "attribute2", "bad")),
        "attribute2", "bad");
    checkValidation_V(pattern.validateAttributes(new AttributesImpl(
        "attribute3", "abccccccccccef")));
    checkValidation_V(pattern.validateAttributes(new AttributesImpl(
        "attribute3", "abcdef")));
    checkValidation_IAV(pattern.validateAttributes(new AttributesImpl(
        "attribute3", "abccdef")),
        "attribute3", "abccdef");
  }

  /**
   * Tests a bad schema with no root specified.
   */
  public void testBadSchema1() throws IOException, ParseException {
    checkInvalidSchemaExceptionIsThrown("bad1.schema");
  }

  /**
   * Tests a bad schema with an undefined root.
   */
  public void testBadSchema2() throws IOException, ParseException {
    checkInvalidSchemaExceptionIsThrown("bad2.schema");
  }

  /**
   * Tests a bad schema with a duplicate element.
   */
  public void testBadSchema3() throws IOException, ParseException {
    checkInvalidSchemaExceptionIsThrown("bad3.schema");
  }

  /**
   * Tests a bad schema with a duplicate attribute.
   */
  public void testBadSchema4() throws IOException, ParseException {
    checkInvalidSchemaExceptionIsThrown("bad4.schema");
  }

  /**
   * Tests a bad schema with a duplicate definition.
   */
  public void testBadSchema5() throws IOException, ParseException {
    checkInvalidSchemaExceptionIsThrown("bad5.schema");
  }

  /**
   * Tests a bad schema with an element clash through a reference.
   */
  public void testBadSchema6() throws IOException, ParseException {
    checkInvalidSchemaExceptionIsThrown("bad6.schema");
  }

  /**
   * Tests a bad schema with an attribute clash through a reference.
   */
  public void testBadSchema7() throws IOException, ParseException {
    checkInvalidSchemaExceptionIsThrown("bad7.schema");
  }

  /**
   * Tests a bad schema with an infinite recursion.
   */
  public void testBadSchema8() throws IOException, ParseException {
    checkInvalidSchemaExceptionIsThrown("bad8.schema");
  }

  /**
   * Tests a bad schema with an infinite recursion through indirect means.
   */
  public void testBadSchema9() throws IOException, ParseException {
    checkInvalidSchemaExceptionIsThrown("bad9.schema");
  }

  /**
   * Tests a bad schema with a bad regular expression beginning with '*'.
   */
  public void testBadSchema10() throws IOException, ParseException {
    checkInvalidSchemaExceptionIsThrown("bad10.schema");
  }

  /**
   * Tests a bad schema with a bad regular expression beginning with '?'.
   */
  public void testBadSchema11() throws IOException, ParseException {
    checkInvalidSchemaExceptionIsThrown("bad11.schema");
  }

  /**
   * Tests a bad schema with a bad regular expression beginning with ')'.
   */
  public void testBadSchema12() throws IOException, ParseException {
    checkInvalidSchemaExceptionIsThrown("bad12.schema");
  }

  /**
   * Tests a bad schema with a bad regular expression with an unexpected '*'.
   */
  public void testBadSchema13() throws IOException, ParseException {
    checkInvalidSchemaExceptionIsThrown("bad13.schema");
  }

  /**
   * Tests a bad schema with a bad regular expression with an unexpected '?'.
   */
  public void testBadSchema14() throws IOException, ParseException {
    checkInvalidSchemaExceptionIsThrown("bad14.schema");
  }

  /**
   * Tests a bad schema with a bad regular expression ending with '\\'.
   */
  public void testBadSchema15() throws IOException, ParseException {
    checkInvalidSchemaExceptionIsThrown("bad15.schema");
  }

  /**
   * Tests a bad schema with a bad regular expression with a single '('.
   */
  public void testBadSchema16() throws IOException, ParseException {
    checkInvalidSchemaExceptionIsThrown("bad16.schema");
  }

  /**
   * Tests a bad schema with a bad regular expression with a single ')'.
   */
  public void testBadSchema17() throws IOException, ParseException {
    checkInvalidSchemaExceptionIsThrown("bad17.schema");
  }

  /**
   * Tests a bad schema with a bad regular expression with an unmatched '('.
   */
  public void testBadSchema18() throws IOException, ParseException {
    checkInvalidSchemaExceptionIsThrown("bad18.schema");
  }

  /**
   * Tests a bad schema with a bad regular expression with an unmatched ')'.
   */
  public void testBadSchema19() throws IOException, ParseException {
    checkInvalidSchemaExceptionIsThrown("bad19.schema");
  }

  /**
   * Tests a bad schema with a top-level reference to an undefined definition.
   */
  public void testBadSchema120() throws IOException, ParseException {
    checkInvalidSchemaExceptionIsThrown("bad20.schema");
  }

  /**
   * Tests a bad schema with a reference, not at the top level, to an undefined
   * definition.
   */
  public void testBadSchema21() throws IOException, ParseException {
    checkInvalidSchemaExceptionIsThrown("bad21.schema");
  }

  /**
   * Tests a bad schema containing an invalid element type.
   */
  public void testBadSchema22() throws IOException, ParseException {
    checkInvalidSchemaExceptionIsThrown("bad22.schema");
  }

  /**
   * Tests a bad schema containing an unknown attribute.
   */
  public void testBadSchema23() throws IOException, ParseException {
    checkInvalidSchemaExceptionIsThrown("bad23.schema");
  }

  /**
   * Tests a bad schema with a missing name attribute for a definition element.
   */
  public void testBadSchema24() throws IOException, ParseException {
    checkInvalidSchemaExceptionIsThrown("bad24.schema");
  }

  // TODO(user): We can test for more things similar to testBadSchema23 and
  // testBadSchema24.

  private static void checkEmptyPattern(SchemaPattern pattern) {
    assertEquals(0, pattern.prologue().size());
    checkValidation_ANA(pattern.validateAttributes(SAMPLE_ATTRIBUTES), "name1");
    checkValidation_ANA(pattern.validateAttributesUpdate(SAMPLE_ATTRIBUTES_UPDATE), "name1");
    assertEquals(0, pattern.validateCharacters("abcd"));
    assertNull(pattern.child("bad"));
  }

  /**
   * Checks that the validation result is VALID.
   */
  private static void checkValidation_V(AttributeValidationResult result) {
    assertEquals(Type.VALID, result.getType());
  }

  /**
   * Checks that the validation result is ATTRIBUTE_NOT_ALLOWED.
   */
  private static void checkValidation_ANA(AttributeValidationResult result, String name) {
    assertEquals(Type.ATTRIBUTE_NOT_ALLOWED, result.getType());
    AttributeNotAllowed ana = result.asAttributeNotAllowed();
    assertEquals(name, ana.getName());
  }

  /**
   * Checks that the validation result is INVALID_ATTRIBUTE_VALUE.
   */
  private static void checkValidation_IAV(AttributeValidationResult result,
      String name, String value) {
    assertEquals(Type.INVALID_ATTRIBUTE_VALUE, result.getType());
    InvalidAttributeValue iav = result.asInvalidAttributeValue();
    assertEquals(name, iav.getName());
    assertEquals(value, iav.getValue());
  }

  /**
   * Checks that the validation result is MISSING_REQUIRED_ATTRIBUTE.
   */
  private static void checkValidation_MRA(AttributeValidationResult result, String name) {
    assertEquals(Type.MISSING_REQUIRED_ATTRIBUTE, result.getType());
    MissingRequiredAttribute mra = result.asMissingRequiredAttribute();
    assertEquals(name, mra.getName());
  }

  /**
   * Checks that the validation result is REMOVING_REQUIRED_ATTRIBUTE.
   */
  private static void checkValidation_RRA(AttributeValidationResult result, String name) {
    assertEquals(Type.REMOVING_REQUIRED_ATTRIBUTE, result.getType());
    RemovingRequiredAttribute rra = result.asRemovingRequiredAttribute();
    assertEquals(name, rra.getName());
  }

  private static SchemaPattern readSchema(String filename)
      throws InvalidSchemaException, IOException, ParseException {
    InputStream stream = SchemaFactoryTest.class.getResourceAsStream(filename);
    return SchemaFactory.createSchemaPattern(DocInitializationParser.parseNonCharacterData(stream));
  }

  private static void checkInvalidSchemaExceptionIsThrown(String filename)
      throws IOException, ParseException {
    InputStream stream = SchemaFactoryTest.class.getResourceAsStream(filename);
    try {
      SchemaPattern pattern =
          SchemaFactory.createSchemaPattern(DocInitializationParser.parseNonCharacterData(stream));
      fail("The expected InvalidSchemaException was not thrown");
    } catch (InvalidSchemaException e) {
    }
  }

}
TOP

Related Classes of org.waveprotocol.wave.model.experimental.schema.SchemaFactoryTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.