/*
 * Copyright 2008 Le Duc Bao
 * 
 * Licensed 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.castor.xml.schema.simpleType;

import static org.junit.Assert.assertEquals;

import org.castor.xml.schema.ComparisResultExtractor;
import org.castor.xml.schema.ComparisonResult;
import org.exolab.castor.xml.schema.AttributeDecl;
import org.exolab.castor.xml.schema.Facet;
import org.exolab.castor.xml.schema.Schema;
import org.exolab.castor.xml.schema.SimpleType;
import org.junit.Test;

/**
 * This test covers simple type generation.
 * 
 * @author <a href="mailto:leducbao AT gmail DOT com">Le Duc Bao</a>
 */
public class SimpleTypeTest {

  /**
   * very simple type
   * 
   * @throws Exception
   */
  @Test
  public void testSimpleType() throws Exception {

    // create a new XML schema representation.
    Schema schema = new Schema();

    // create targeted schema
    schema.addNamespace("pre", "my.namespace.org");
    SimpleType sType = schema.createSimpleType("myType", "string", "");

    schema.addSimpleType(sType);

    // compare
    ComparisonResult result = ComparisResultExtractor.doTest(schema,
        this.getClass().getResource("simpletype_simple.xsd"));
    assertEquals("single attribute test failed", ComparisonResult.IDENTICAL, result);
  }

  /**
   * test create attribute, fixed value
   * 
   * @throws Exception
   */
  @Test
  public void testAttributeCreation() throws Exception {

    // create a new XML schema representation.
    Schema schema = new Schema();

    // create targeted schema
    schema.addNamespace("pre", "my.namespace.org");

    AttributeDecl attr = new AttributeDecl(schema);
    attr.setName("myAttr");
    attr.setSimpleTypeReference("string");
    attr.setFixedValue("#hello");
    attr.setUse(AttributeDecl.USE_OPTIONAL);
    schema.addAttribute(attr);

    // compare
    ComparisonResult result = ComparisResultExtractor.doTest(schema,
        this.getClass().getResource("simpletype_attributecreation.xsd"));
    assertEquals("testAttributeCreation test failed", ComparisonResult.IDENTICAL, result);
  }

  /**
   * test create attribute
   * 
   * @throws Exception
   */
  public void testAttributeCreation2() throws Exception {

    // create a new XML schema representation.
    Schema schema = new Schema();

    // create targeted schema
    schema.addNamespace("pre", "my.namespace.org");

    AttributeDecl attr = new AttributeDecl(schema);
    attr.setName("myAttr");
    attr.setSimpleTypeReference("string");
    attr.setDefaultValue("hello");
    attr.setUse(AttributeDecl.USE_PROHIBITED);

    schema.addAttribute(attr);

    // compare
    ComparisonResult result = ComparisResultExtractor.doTest(schema,
        this.getClass().getResource("simpletype_attributecreation2.xsd"));
    assertEquals("testAttributeCreation2 test failed", ComparisonResult.IDENTICAL, result);
  }

  /**
   * test create attribute, use required
   * 
   * @throws Exception
   */
  public void testAttributeCreation3() throws Exception {

    // create a new XML schema representation.
    Schema schema = new Schema();

    // create targeted schema
    schema.addNamespace("pre", "my.namespace.org");

    AttributeDecl attr = new AttributeDecl(schema);
    attr.setName("myAttr");
    attr.setSimpleTypeReference("string");
    attr.setDefaultValue("hello");
    attr.setUse(AttributeDecl.USE_REQUIRED);

    schema.addAttribute(attr);

    // compare
    ComparisonResult result = ComparisResultExtractor.doTest(schema,
        this.getClass().getResource("simpletype_attributecreation3.xsd"));
    assertEquals("testAttributeCreation3 test failed", ComparisonResult.IDENTICAL, result);
  }

  // restriction
  /**
   * test create facet/min-max
   * 
   * @throws Exception
   */
  public void testMinMax() throws Exception {

    // create a new XML schema representation.
    Schema schema = new Schema();

    // create targeted schema
    schema.addNamespace("pre", "my.namespace.org");

    SimpleType sType = schema.createSimpleType("myType", "int", "");

    Facet min = new Facet(Facet.MIN_EXCLUSIVE, "0");
    Facet max = new Facet(Facet.MAX_EXCLUSIVE, "100");
    sType.addFacet(min);
    sType.addFacet(max);

    schema.addSimpleType(sType);

    // compare
    ComparisonResult result = ComparisResultExtractor.doTest(schema,
        this.getClass().getResource("simpletype_res_minmax.xsd"));
    assertEquals("testMinMax test failed", ComparisonResult.IDENTICAL, result);
  }
  // min inclusive, max inclusive
  // leng, max length, min length
  // whiteSpace preserve, replace, collapse
  // enumeration
  // union
  // pattern
  // precision, total digits, fraction digits
}
