SummarizeReceiptJobFlow extends FlowDescription { public SummarizeReceiptJobFlow( @Import(name = "receipt", description = ReceiptFromCSV.class) In<Receipt> receipt, @Import(name = "shop", description = ShopFromCSV.class) In<Shop> shop, @Import(name = "item", description = ItemFromCSV.class) In<Item> item, @Export(name = "itemSummary", description = ItemSummaryToCSV.class) Out<ItemSummary> itemSummary, @Export(name = "categorySummary", description = CategorySummaryToCSV.class) Out<CategorySummary> categorySummary, @Export(name = "shopSummary", description = ShopSummaryToCSV.class) Out<ShopSummary> shopSummary, @Export(name = "error", description = ErrorReceiptToCSV.class) Out<ErrorReceipt> error) { this.receipt = receipt; this.shop = shop; this.item = item; this.itemSummary = itemSummary; this.categorySummary = categorySummary; this.shopSummary = shopSummary; this.error = error; } SummarizeReceiptJobFlow(
			@Import(name = "receipt", description = ReceiptFromCSV.class)
			In<Receipt> receipt,
			@Import(name = "shop", description = ShopFromCSV.class)
			In<Shop> shop,
			@Import(name = "item", description = ItemFromCSV.class)
			In<Item> item,
			@Export(name = "itemSummary", description = ItemSummaryToCSV.class)
			Out<ItemSummary> itemSummary,
			@Export(name = "categorySummary", description = CategorySummaryToCSV.class)
			Out<CategorySummary> categorySummary,
			@Export(name = "shopSummary", description = ShopSummaryToCSV.class)
			Out<ShopSummary> shopSummary,
			@Export(name = "error", description = ErrorReceiptToCSV.class)
			Out<ErrorReceipt> error); @Override void describe();  }
@Test public void testSummarizeReceiptJobFlow() { tester.input("receipt", Receipt.class) .prepare(INPUT_PATH + "/receipt.xls#input"); tester.input("shop", Shop.class) .prepare(INPUT_PATH + "/shop.xls#input"); tester.input("item", Item.class) .prepare(INPUT_PATH + "/item.xls#input"); tester.output("error", ErrorReceipt.class) .verify(OUTPUT_PATH + "/expected_error_receipt.xls#output", OUTPUT_PATH + "/expected_error_receipt.xls#rule") .dumpActual(new ExcelSheetSinkFactory("target" + DUMP_PATH + "/error_receipt_actual.xls")) .dumpDifference(new HtmlDifferenceSinkFactory("target" + DUMP_PATH + "/error_receipt_difference.html")); tester.output("itemSummary", ItemSummary.class) .verify(OUTPUT_PATH + "/expected_item_summary.xls#output", OUTPUT_PATH + "/expected_item_summary.xls#rule") .dumpActual(new ExcelSheetSinkFactory("target" + DUMP_PATH + "/item_summary_actual.xls")) .dumpDifference(new HtmlDifferenceSinkFactory("target" + DUMP_PATH + "/item_summary_difference.html")); tester.output("categorySummary", CategorySummary.class) .verify(OUTPUT_PATH + "/expected_category_summary.xls#output", OUTPUT_PATH + "/expected_category_summary.xls#rule") .dumpActual(new ExcelSheetSinkFactory("target" + DUMP_PATH + "/category_summary_actual.xls")) .dumpDifference(new HtmlDifferenceSinkFactory("target" + DUMP_PATH + "/category_summary_difference.html")); tester.output("shopSummary", ShopSummary.class) .verify(OUTPUT_PATH + "/expected_shop_summary.xls#output", OUTPUT_PATH + "/expected_shop_summary.xls#rule") .dumpActual(new ExcelSheetSinkFactory("target" + DUMP_PATH + "/shop_summary_actual.xls")) .dumpDifference(new HtmlDifferenceSinkFactory("target" + DUMP_PATH + "/shop_summary_difference.html")); tester.runTest(SummarizeReceiptJobFlow.class); }