/*
 * 
 */
package org.castor.xml.schema.writer;

import org.exolab.castor.xml.schema.ComplexType;
import org.exolab.castor.xml.schema.ElementDecl;
import org.exolab.castor.xml.schema.Group;
import org.exolab.castor.xml.schema.Order;
import org.exolab.castor.xml.schema.Particle;

/**
 * @author <a href="mailto:bao.leduc@orange-ftgroup.com">Le Duc Bao</a>
 * @version 1.0
 * @since 5 oct. 08 11:30:54
 */
public class GroupTest extends AbstractSchemaTest {

  public GroupTest(String testcase) {
    super(testcase);
  }

  // /**
  // * Create simple type
  // */
  // public void testOneChildSubgroup() throws Exception {
  //
  // // create targeted schema
  // ComplexType ctype = _schema.createComplexType();
  // ctype.setName("myType");
  // _schema.addComplexType(ctype);
  //
  // // create a sequence element
  // Group groupTest = new Group();
  // groupTest.setOrder(Order.seq);
  // ctype.addGroup(groupTest);
  //
  // // create a choice element for sequence element
  // Group subgroup = new Group();
  // subgroup.setOrder(Order.choice);
  // subgroup.setMinOccurs(0);
  // subgroup.setMaxOccurs(Particle.UNBOUNDED);
  // groupTest.addGroup(subgroup);
  //
  // // create an element for choice
  // ElementDecl elem = new ElementDecl(_schema);
  // elem.setName("myStringType");
  // elem.setTypeReference("string");
  // subgroup.addElementDecl(elem);
  //
  // // compare
  // TestResult result = doTest("group_onechildsubgroup.xsd");
  // assertEquals("single attribute test failed", TestResult.IDENTICAL,
  // result);
  // }

  /**
   * Create simple type
   */
  public void testSubgroupWithAnElement() throws Exception {

    // create targeted schema
    ComplexType ctype = _schema.createComplexType();
    ctype.setName("myType");
    _schema.addComplexType(ctype);

    // create a sequence element
    Group group = new Group();
    group.setOrder(Order.sequence);
    ctype.addGroup(group);

    // create a choice element for sequence element
    Group subgroup = new Group();
    subgroup.setOrder(Order.choice);
    subgroup.setMinOccurs(0);
    subgroup.setMaxOccurs(Particle.UNBOUNDED);
    group.addGroup(subgroup);

    // create an element for choice
    ElementDecl elem = new ElementDecl(_schema);
    elem.setName("myStringType");
    elem.setTypeReference("string");
    subgroup.addElementDecl(elem);

    elem = new ElementDecl(_schema);
    elem.setName("myStringType2");
    elem.setTypeReference("string");
    group.addElementDecl(elem);

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

  /**
   * Create simple type
   */
  public void test2Subgroups() throws Exception {

    // create targeted schema
    ComplexType ctype = _schema.createComplexType();
    ctype.setName("myType");
    _schema.addComplexType(ctype);

    // create a sequence element
    Group group = new Group();
    group.setOrder(Order.sequence);
    ctype.addGroup(group);

    // create a choice element for sequence element
    Group subgroup = new Group();
    subgroup.setOrder(Order.choice);
    subgroup.setMinOccurs(0);
    subgroup.setMaxOccurs(Particle.UNBOUNDED);
    group.addGroup(subgroup);

    // create an element for choice
    ElementDecl elem = new ElementDecl(_schema);
    elem.setName("myStringType");
    elem.setTypeReference("string");
    subgroup.addElementDecl(elem);

    // create a choice element for sequence element
    subgroup = new Group();
    subgroup.setOrder(Order.choice);
    subgroup.setMinOccurs(0);
    subgroup.setMaxOccurs(Particle.UNBOUNDED);
    group.addGroup(subgroup);

    // create an element for choice
    elem = new ElementDecl(_schema);
    elem.setName("myStringType2");
    elem.setTypeReference("string");
    subgroup.addElementDecl(elem);
    // compare
    TestResult result = doTest("group_2subgroups.xsd");
    assertEquals("single attribute test failed", TestResult.IDENTICAL, result);
  }
}
