@Test
  public void testParametricMethod() throws Exception {
    final ProjectDataModelOracle projectLoader =
        ProjectDataModelOracleBuilder.newProjectOracleBuilder()
            .addClass(Purchase.class, new HashMap<String, FactBuilder>())
            .build();

    final PackageDataModelOracle packageLoader =
        PackageDataModelOracleBuilder.newPackageOracleBuilder(
                "org.kie.workbench.common.widgets.client.datamodel.testclasses")
            .setProjectOracle(projectLoader)
            .build();

    // Emulate server-to-client conversions
    final MockAsyncPackageDataModelOracleImpl oracle = new MockAsyncPackageDataModelOracleImpl();
    final Caller<IncrementalDataModelService> service =
        new MockIncrementalDataModelServiceCaller(packageLoader);
    oracle.setService(service);

    final PackageDataModelOracleBaselinePayload dataModel =
        new PackageDataModelOracleBaselinePayload();
    dataModel.setPackageName(packageLoader.getPackageName());
    dataModel.setModelFields(packageLoader.getProjectModelFields());
    dataModel.setFieldParametersType(packageLoader.getProjectFieldParametersType());
    PackageDataModelOracleTestUtils.populateDataModelOracle(
        mock(Path.class), new MockHasImports(), oracle, dataModel);

    assertNotNull(oracle);

    assertEquals(
        "Product", oracle.getParametricFieldType("Purchase", "customerPurchased(Integer)"));
  }
  @Test
  public void testPackageDMOParametricReturnTypes() throws Exception {
    final Map<String, FactBuilder> discoveredFieldFactBuilders = new HashMap<String, FactBuilder>();
    final ProjectDataModelOracle projectLoader =
        ProjectDataModelOracleBuilder.newProjectOracleBuilder()
            .addClass(Purchase.class, discoveredFieldFactBuilders)
            .addClass(Product.class, discoveredFieldFactBuilders)
            .build();

    final PackageDataModelOracle packageLoader =
        PackageDataModelOracleBuilder.newPackageOracleBuilder(
                "org.kie.workbench.common.widgets.client.datamodel.testclasses")
            .setProjectOracle(projectLoader)
            .build();

    // Emulate server-to-client conversions
    final MockAsyncPackageDataModelOracleImpl oracle = new MockAsyncPackageDataModelOracleImpl();
    final Caller<IncrementalDataModelService> service =
        new MockIncrementalDataModelServiceCaller(packageLoader);
    oracle.setService(service);

    final PackageDataModelOracleBaselinePayload dataModel =
        new PackageDataModelOracleBaselinePayload();
    dataModel.setPackageName(packageLoader.getPackageName());
    dataModel.setModelFields(packageLoader.getProjectModelFields());
    dataModel.setFieldParametersType(packageLoader.getProjectFieldParametersType());
    PackageDataModelOracleTestUtils.populateDataModelOracle(
        mock(Path.class), new MockHasImports(), oracle, dataModel);

    assertNotNull(oracle);

    assertEquals(3, oracle.getFactTypes().length);

    List<String> list = Arrays.asList(oracle.getFactTypes());

    assertTrue(list.contains("Purchase"));
    assertTrue(list.contains("Product"));

    assertEquals("java.util.Collection", oracle.getFieldClassName("Purchase", "items"));
    assertEquals(DataType.TYPE_COLLECTION, oracle.getFieldType("Purchase", "items"));
    assertEquals("Product", oracle.getParametricFieldType("Purchase", "items"));
  }