@Test
 @SuppressWarnings("unchecked")
 public void testSequentials() {
   Map<String, Object> attrib = (Map<String, Object>) model.get("sequentialAttribute1");
   ModelUtils.checkType(attrib, "ceylon.language::Sequential<ceylon.language::Integer>");
   attrib = (Map<String, Object>) model.get("sequentialAttribute2");
   ModelUtils.checkType(attrib, "ceylon.language::Sequential<ceylon.language::Integer>");
 }
  @Test
  @SuppressWarnings("unchecked")
  public void testSimpleMethods() {
    // simple1
    Map<String, Object> method = (Map<String, Object>) model.get("simple1");
    Assert.assertNotNull(method);
    ModelUtils.checkMap(
        method,
        MetamodelGenerator.KEY_NAME,
        "simple1",
        MetamodelGenerator.KEY_METATYPE,
        MetamodelGenerator.METATYPE_METHOD);
    ModelUtils.checkType(method, "ceylon.language::Anything");

    method = (Map<String, Object>) model.get("simple2");
    ModelUtils.checkMap(
        method,
        MetamodelGenerator.KEY_NAME,
        "simple2",
        MetamodelGenerator.KEY_METATYPE,
        MetamodelGenerator.METATYPE_METHOD);
    ModelUtils.checkAnnotations(method, "shared");
    ModelUtils.checkType(method, "ceylon.language::Integer");

    method = (Map<String, Object>) model.get("simple3");
    ModelUtils.checkMap(
        method,
        MetamodelGenerator.KEY_NAME,
        "simple3",
        MetamodelGenerator.KEY_METATYPE,
        MetamodelGenerator.METATYPE_METHOD);
    ModelUtils.checkType(method, "ceylon.language::Anything");
    ModelUtils.checkParam(method, 0, "p1", "ceylon.language::Integer", false, false);
    ModelUtils.checkParam(method, 1, "p2", "ceylon.language::String", false, false);
  }
 @Test
 @SuppressWarnings("unchecked")
 public void testAttributes() {
   Map<String, Object> attrib = (Map<String, Object>) model.get("i1");
   ModelUtils.checkType(attrib, "ceylon.language::Integer");
   Assert.assertEquals(
       "Wrong model type for i1",
       MetamodelGenerator.METATYPE_ATTRIBUTE,
       attrib.get(MetamodelGenerator.KEY_METATYPE));
   attrib = (Map<String, Object>) model.get("s1");
   ModelUtils.checkType(attrib, "ceylon.language::String");
   ModelUtils.checkAnnotations(attrib, "shared");
   attrib = (Map<String, Object>) model.get("pi");
   ModelUtils.checkType(attrib, "ceylon.language::Float");
   ModelUtils.checkAnnotations(attrib, "variable");
   attrib = (Map<String, Object>) model.get("seq");
   ModelUtils.checkType(attrib, "ceylon.language::Sequence<ceylon.language::Integer>");
   ModelUtils.checkAnnotations(attrib, "shared", "variable");
   attrib = (Map<String, Object>) model.get("union");
   ModelUtils.checkType(attrib, "ceylon.language::Integer|ceylon.language::String");
   attrib = (Map<String, Object>) model.get("useq");
   ModelUtils.checkType(
       attrib,
       "ceylon.language::Iterable<ceylon.language::Singleton<ceylon.language::Integer>|ceylon.language::String>");
 }
  @Test
  @SuppressWarnings("unchecked")
  public void testMultipleParameterLists() {
    Map<String, Object> method = (Map<String, Object>) model.get("mpl1");
    ModelUtils.checkParam(method, 0, "a", "ceylon.language::String", false, false);
    ModelUtils.checkType(method, "ceylon.language::Integer");

    method = (Map<String, Object>) model.get("mpl2");
    ModelUtils.checkParam(method, 0, "a", "ceylon.language::Integer", false, false);
    ModelUtils.checkType(method, "ceylon.language::String");
  }
 @Test
 @SuppressWarnings("unchecked")
 public void testIntersectionTypes() {
   Map<String, Object> method = (Map<String, Object>) model.get("intersector1");
   ModelUtils.checkParam(
       method,
       0,
       "inters",
       "ceylon.language::Category&ceylon.language::Iterable<ceylon.language::Anything>",
       false,
       false);
   method = (Map<String, Object>) model.get("intersector2");
   System.out.println(method);
   ModelUtils.checkParam(
       method,
       0,
       "beast",
       "ceylon.language::Category&ceylon.language::Iterable<ceylon.language::Iterable<ceylon.language::Anything>>",
       false,
       false);
 }
  @Test
  @SuppressWarnings("unchecked")
  public void testParameterTypes() {
    Map<String, Object> method = (Map<String, Object>) model.get("parmtypes1");
    ModelUtils.checkParam(
        method, 0, "x", "ceylon.language::Sequence<ceylon.language::Integer>", false, false);

    method = (Map<String, Object>) model.get("parmtypes2");
    ModelUtils.checkParam(
        method,
        0,
        "xx",
        "ceylon.language::Sequence<ceylon.language::Iterable<ceylon.language::String>>",
        false,
        false);

    method = (Map<String, Object>) model.get("parmtypes3");
    ModelUtils.checkType(method, "ceylon.language::Sequence<ceylon.language::String>");

    method = (Map<String, Object>) model.get("parmtypes4");
    ModelUtils.checkType(method, "SomethingElse");
    List<Map<String, Object>> cons =
        (List<Map<String, Object>>) method.get(MetamodelGenerator.KEY_TYPE_PARAMS);
    ModelUtils.checkTypeParameters(
        0,
        (List<Map<String, Object>>) cons.get(0).get(MetamodelGenerator.KEY_SATISFIES),
        "ceylon.language::Comparable<Something>");
    ModelUtils.checkTypeParameters(
        0,
        (List<Map<String, Object>>) cons.get(1).get(MetamodelGenerator.KEY_SATISFIES),
        "Something");

    method = (Map<String, Object>) model.get("parmtypes5");
    ModelUtils.checkParam(method, 0, "x", "Value", false, false);
    cons = (List<Map<String, Object>>) method.get(MetamodelGenerator.KEY_TYPE_PARAMS);
    Assert.assertNotNull("parmtypes5 should have parameters", cons);
    Assert.assertNotNull("parmtypes5 should have case types", cons.get(0).get("of"));
    ModelUtils.checkTypeParameters(
        0,
        (List<Map<String, Object>>) cons.get(0).get("of"),
        "ceylon.language::Integer,ceylon.language::Float");
  }
  @Test
  @SuppressWarnings("unchecked")
  public void testDefaultedAndSequencedMethods() {
    Map<String, Object> method = (Map<String, Object>) model.get("defaulted1");
    ModelUtils.checkParam(method, 0, "p1", "ceylon.language::Integer", false, false);
    ModelUtils.checkParam(method, 1, "p2", "ceylon.language::Integer", true, false);

    method = (Map<String, Object>) model.get("sequenced1");
    ModelUtils.checkParam(method, 0, "p1", "ceylon.language::Integer", false, false);
    ModelUtils.checkParam(method, 1, "p2", "ceylon.language::String", false, true);

    method = (Map<String, Object>) model.get("sequencedDefaulted");
    ModelUtils.checkParam(method, 0, "s", "ceylon.language::String", true, false);
    ModelUtils.checkParam(method, 1, "ints", "ceylon.language::Integer", false, true);
  }