@Override
  protected void setUp() throws Exception {
    super.setUp();

    facetFactory = new TypeOfAnnotationForCollectionsFacetFactory();
    facetFactory.setCollectionTypeRegistry(new CollectionTypeRegistryDefault());
  }
  public void testTypeOfAnnotationIgnoredForActionIfReturnTypeIsntACollectionType() {
    class Order {}
    class Customer {
      @SuppressWarnings("unused")
      @TypeOf(Order.class)
      public Customer someAction() {
        return null;
      }
    }
    final Method actionMethod = findMethod(Customer.class, "someAction");

    facetFactory.process(
        new ProcessMethodContext(Customer.class, actionMethod, methodRemover, facetedMethod));

    assertNull(facetedMethod.getFacet(TypeOfFacet.class));

    assertNoMethodsRemoved();
  }
  public void testTypeOfFacetInferredForActionWithGenericCollectionReturnType() {
    class Order {}
    class Customer {
      @SuppressWarnings("unused")
      public Collection<Order> someAction() {
        return null;
      }
    }
    final Method actionMethod = findMethod(Customer.class, "someAction");

    facetFactory.process(
        new ProcessMethodContext(Customer.class, actionMethod, methodRemover, facetedMethod));

    final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
    assertNotNull(facet);
    assertTrue(facet instanceof TypeOfFacetInferredFromGenerics);
    final TypeOfFacetInferredFromGenerics typeOfFacetInferredFromGenerics =
        (TypeOfFacetInferredFromGenerics) facet;
    assertEquals(Order.class, typeOfFacetInferredFromGenerics.value());
  }
  public void testTypeOfFacetIsInferredForCollectionFromOrderArray() {
    class Order {}
    class Customer {
      @SuppressWarnings("unused")
      public Order[] getOrders() {
        return null;
      }
    }
    final Method collectionAccessorMethod = findMethod(Customer.class, "getOrders");

    facetFactory.process(
        new ProcessMethodContext(
            Customer.class, collectionAccessorMethod, methodRemover, facetedMethod));

    final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
    assertNotNull(facet);
    assertTrue(facet instanceof TypeOfFacetInferredFromArray);
    final TypeOfFacetInferredFromArray typeOfFacetInferredFromArray =
        (TypeOfFacetInferredFromArray) facet;
    assertEquals(Order.class, typeOfFacetInferredFromArray.value());
  }
  public void testTypeOfFacetInferredForCollectionWithJavaUtilSetReturnType() {
    class Order {}
    class Customer {
      @SuppressWarnings("unused")
      @TypeOf(Order.class)
      public Set getOrders() {
        return null;
      }
    }
    final Method accessorMethod = findMethod(Customer.class, "getOrders");

    facetFactory.process(
        new ProcessMethodContext(Customer.class, accessorMethod, methodRemover, facetedMethod));

    final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
    assertNotNull(facet);
    assertTrue(facet instanceof TypeOfFacetAnnotationForCollection);
    final TypeOfFacetAnnotationForCollection typeOfFacetAnnotationForCollection =
        (TypeOfFacetAnnotationForCollection) facet;
    assertEquals(Order.class, typeOfFacetAnnotationForCollection.value());

    assertNoMethodsRemoved();
  }
  public void testTypeOfFacetInferredForActionWithJavaUtilCollectionReturnType() {
    class Order {}
    class Customer {
      // rawtypes are intention for this test
      @SuppressWarnings({"unused", "rawtypes"})
      @TypeOf(Order.class)
      public Collection someAction() {
        return null;
      }
    }
    final Method actionMethod = findMethod(Customer.class, "someAction");

    facetFactory.process(
        new ProcessMethodContext(Customer.class, actionMethod, methodRemover, facetedMethod));

    final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
    assertNotNull(facet);
    assertTrue(facet instanceof TypeOfFacetAnnotationForCollection);
    final TypeOfFacetAnnotationForCollection typeOfFacetAnnotationForCollection =
        (TypeOfFacetAnnotationForCollection) facet;
    assertEquals(Order.class, typeOfFacetAnnotationForCollection.value());

    assertNoMethodsRemoved();
  }