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

import org.exolab.castor.xml.schema.AttributeDecl;
import org.exolab.castor.xml.schema.Facet;
import org.exolab.castor.xml.schema.SimpleType;

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

  /**
   * @param Constructor
   */
  public SimpleTypeTest(String testcase) {
    super(testcase);
  }

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

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

    _schema.addSimpleType(sType);

    // compare
    TestResult result = doTest("simpletype_simple.xsd");
    assertEquals("single attribute test failed", TestResult.IDENTICAL, result);
  }

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

    // 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
    TestResult result = doTest("simpletype_attributecreation.xsd");
    assertEquals("testAttributeCreation test failed", TestResult.IDENTICAL, result);
  }

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

    // 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
    TestResult result = doTest("simpletype_attributecreation2.xsd");
    assertEquals("testAttributeCreation2 test failed", TestResult.IDENTICAL, result);
  }

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

    // 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
    TestResult result = doTest("simpletype_attributecreation3.xsd");
    assertEquals("testAttributeCreation3 test failed", TestResult.IDENTICAL, result);
  }

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

    // 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
    TestResult result = doTest("simpletype_res_minmax.xsd");
    assertEquals("testMinMax test failed", TestResult.IDENTICAL, result);
  }
  // min inclusive, max inclusive
  // leng, max length, min length
  // whiteSpace preserve, replace, collapse
  // enumeration
  // union
  // pattern
  // precision, total digits, fraction digits
}
