| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library barback.test.package_graph.transform_test; | 5 library barback.test.package_graph.transform_test; |
| 6 | 6 |
| 7 import 'package:barback/src/utils.dart'; | 7 import 'package:barback/src/utils.dart'; |
| 8 import 'package:scheduled_test/scheduled_test.dart'; | 8 import 'package:scheduled_test/scheduled_test.dart'; |
| 9 | 9 |
| 10 import '../utils.dart'; | 10 import '../utils.dart'; |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 expect(transformerB.isRunning, completion(isTrue)); | 113 expect(transformerB.isRunning, completion(isTrue)); |
| 114 | 114 |
| 115 transformerA.resumeApply(); | 115 transformerA.resumeApply(); |
| 116 transformerB.resumeApply(); | 116 transformerB.resumeApply(); |
| 117 | 117 |
| 118 expectAsset("app|foo.a", "foo.a"); | 118 expectAsset("app|foo.a", "foo.a"); |
| 119 expectAsset("app|foo.b", "foo.b"); | 119 expectAsset("app|foo.b", "foo.b"); |
| 120 buildShouldSucceed(); | 120 buildShouldSucceed(); |
| 121 }); | 121 }); |
| 122 | 122 |
| 123 test("outputs are inaccessible once used", () { | 123 test("outputs are passed through transformers by default", () { |
| 124 initGraph(["app|foo.a"], {"app": [ | 124 initGraph(["app|foo.a"], {"app": [ |
| 125 [new RewriteTransformer("a", "b")], | 125 [new RewriteTransformer("a", "b")], |
| 126 [new RewriteTransformer("a", "c")] | 126 [new RewriteTransformer("a", "c")] |
| 127 ]}); | 127 ]}); |
| 128 updateSources(["app|foo.a"]); | 128 updateSources(["app|foo.a"]); |
| 129 expectAsset("app|foo.a", "foo"); |
| 129 expectAsset("app|foo.b", "foo.b"); | 130 expectAsset("app|foo.b", "foo.b"); |
| 130 expectNoAsset("app|foo.a"); | 131 expectAsset("app|foo.c", "foo.c"); |
| 131 expectNoAsset("app|foo.c"); | |
| 132 buildShouldSucceed(); | 132 buildShouldSucceed(); |
| 133 }); | 133 }); |
| 134 | 134 |
| 135 test("does not reapply transform when inputs are not modified", () { | 135 test("does not reapply transform when inputs are not modified", () { |
| 136 var transformer = new RewriteTransformer("blub", "blab"); | 136 var transformer = new RewriteTransformer("blub", "blab"); |
| 137 initGraph(["app|foo.blub"], {"app": [[transformer]]}); | 137 initGraph(["app|foo.blub"], {"app": [[transformer]]}); |
| 138 updateSources(["app|foo.blub"]); | 138 updateSources(["app|foo.blub"]); |
| 139 expectAsset("app|foo.blab", "foo.blab"); | 139 expectAsset("app|foo.blab", "foo.blab"); |
| 140 expectAsset("app|foo.blab", "foo.blab"); | 140 expectAsset("app|foo.blab", "foo.blab"); |
| 141 expectAsset("app|foo.blab", "foo.blab"); | 141 expectAsset("app|foo.blab", "foo.blab"); |
| (...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 544 | 544 |
| 545 rewrite.pauseApply(); | 545 rewrite.pauseApply(); |
| 546 updateSources(["app|foo.txt"]); | 546 updateSources(["app|foo.txt"]); |
| 547 expectAssetDoesNotComplete("app|foo.txt"); | 547 expectAssetDoesNotComplete("app|foo.txt"); |
| 548 | 548 |
| 549 rewrite.resumeApply(); | 549 rewrite.resumeApply(); |
| 550 expectAsset("app|foo.txt", "foo.txt"); | 550 expectAsset("app|foo.txt", "foo.txt"); |
| 551 buildShouldSucceed(); | 551 buildShouldSucceed(); |
| 552 }); | 552 }); |
| 553 | 553 |
| 554 test("doesn't return an asset until we know it won't be transformed", | 554 test("doesn't return a pass-through asset until we know it won't be " |
| 555 () { | 555 "overwritten", () { |
| 556 var rewrite = new RewriteTransformer("txt", "txt"); | 556 var rewrite = new RewriteTransformer("txt", "txt"); |
| 557 initGraph(["app|foo.a"], {"app": [[rewrite]]}); | 557 initGraph(["app|foo.a"], {"app": [[rewrite]]}); |
| 558 | 558 |
| 559 rewrite.pauseIsPrimary("app|foo.a"); | 559 rewrite.pauseIsPrimary("app|foo.a"); |
| 560 updateSources(["app|foo.a"]); | 560 updateSources(["app|foo.a"]); |
| 561 expectAssetDoesNotComplete("app|foo.a"); | 561 expectAssetDoesNotComplete("app|foo.a"); |
| 562 | 562 |
| 563 rewrite.resumeIsPrimary("app|foo.a"); | 563 rewrite.resumeIsPrimary("app|foo.a"); |
| 564 expectAsset("app|foo.a", "foo"); | 564 expectAsset("app|foo.a", "foo"); |
| 565 buildShouldSucceed(); | 565 buildShouldSucceed(); |
| 566 }); | 566 }); |
| 567 | 567 |
| 568 test("doesn't return a modified asset until we know it will still be " | 568 test("doesn't return a pass-through asset until we know it won't be " |
| 569 "transformed", () { | 569 "overwritten when secondary inputs change", () { |
| 570 var manyToOne = new ManyToOneTransformer("txt"); |
| 571 initGraph({ |
| 572 "app|foo.txt": "bar.in", |
| 573 "app|bar.in": "bar" |
| 574 }, {"app": [[manyToOne]]}); |
| 575 |
| 576 updateSources(["app|foo.txt", "app|bar.in"]); |
| 577 expectAsset("app|foo.txt", "bar.in"); |
| 578 expectAsset("app|foo.out", "bar"); |
| 579 |
| 580 manyToOne.pauseApply(); |
| 581 updateSources(["app|bar.in"]); |
| 582 expectAssetDoesNotComplete("app|foo.txt"); |
| 583 |
| 584 manyToOne.resumeApply(); |
| 585 expectAsset("app|foo.txt", "bar.in"); |
| 586 buildShouldSucceed(); |
| 587 }); |
| 588 |
| 589 test("doesn't return an overwritten asset until we know it will still " |
| 590 "be overwritten", () { |
| 570 var rewrite = new RewriteTransformer("txt", "txt"); | 591 var rewrite = new RewriteTransformer("txt", "txt"); |
| 571 initGraph(["app|foo.txt"], {"app": [[rewrite]]}); | 592 initGraph(["app|foo.txt"], {"app": [[rewrite]]}); |
| 572 | 593 |
| 573 updateSources(["app|foo.txt"]); | 594 updateSources(["app|foo.txt"]); |
| 574 expectAsset("app|foo.txt", "foo.txt"); | 595 expectAsset("app|foo.txt", "foo.txt"); |
| 575 buildShouldSucceed(); | 596 buildShouldSucceed(); |
| 576 | 597 |
| 577 rewrite.pauseIsPrimary("app|foo.txt"); | 598 rewrite.pauseIsPrimary("app|foo.txt"); |
| 578 updateSources(["app|foo.txt"]); | 599 updateSources(["app|foo.txt"]); |
| 579 expectAssetDoesNotComplete("app|foo.txt"); | 600 expectAssetDoesNotComplete("app|foo.txt"); |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 840 [new RewriteTransformer("zip", "zap")], | 861 [new RewriteTransformer("zip", "zap")], |
| 841 [new RewriteTransformer("mid", "out")], | 862 [new RewriteTransformer("mid", "out")], |
| 842 ]}); | 863 ]}); |
| 843 | 864 |
| 844 updateSources(["app|foo.in", "app|bar.zip"]); | 865 updateSources(["app|foo.in", "app|bar.zip"]); |
| 845 expectAsset("app|foo.out", "foo.mid.out"); | 866 expectAsset("app|foo.out", "foo.mid.out"); |
| 846 expectAsset("app|bar.zap", "bar.zap"); | 867 expectAsset("app|bar.zap", "bar.zap"); |
| 847 buildShouldSucceed(); | 868 buildShouldSucceed(); |
| 848 }); | 869 }); |
| 849 | 870 |
| 850 test("doesn't pass an asset through a phase in which a transform consumes " | 871 test("passes an asset through a phase in which a transform uses it", () { |
| 851 "it", () { | |
| 852 initGraph([ | 872 initGraph([ |
| 853 "app|foo.in", | 873 "app|foo.in", |
| 854 ], {"app": [ | 874 ], {"app": [ |
| 855 [new RewriteTransformer("in", "mid")], | 875 [new RewriteTransformer("in", "mid")], |
| 856 [new RewriteTransformer("mid", "phase2")], | 876 [new RewriteTransformer("mid", "phase2")], |
| 857 [new RewriteTransformer("mid", "phase3")], | 877 [new RewriteTransformer("mid", "phase3")], |
| 858 ]}); | 878 ]}); |
| 859 | 879 |
| 860 updateSources(["app|foo.in"]); | 880 updateSources(["app|foo.in"]); |
| 881 expectAsset("app|foo.in", "foo"); |
| 882 expectAsset("app|foo.mid", "foo.mid"); |
| 861 expectAsset("app|foo.phase2", "foo.mid.phase2"); | 883 expectAsset("app|foo.phase2", "foo.mid.phase2"); |
| 862 expectNoAsset("app|foo.phase3"); | 884 expectAsset("app|foo.phase3", "foo.mid.phase3"); |
| 863 buildShouldSucceed(); | 885 buildShouldSucceed(); |
| 864 }); | 886 }); |
| 865 | 887 |
| 888 // If the asset were to get passed through, it might either cause a |
| 889 // collision or silently supersede the overwriting asset. We want to assert |
| 890 // that that doesn't happen. |
| 891 test("doesn't pass an asset through a phase in which a transform " |
| 892 "overwrites it", () { |
| 893 initGraph([ |
| 894 "app|foo.txt" |
| 895 ], {"app": [[new RewriteTransformer("txt", "txt")]]}); |
| 896 |
| 897 updateSources(["app|foo.txt"]); |
| 898 expectAsset("app|foo.txt", "foo.txt"); |
| 899 buildShouldSucceed(); |
| 900 }); |
| 901 |
| 866 test("removes a pass-through asset when the source is removed", () { | 902 test("removes a pass-through asset when the source is removed", () { |
| 867 initGraph([ | 903 initGraph([ |
| 868 "app|foo.in", | 904 "app|foo.in", |
| 869 "app|bar.zip", | 905 "app|bar.zip", |
| 870 ], {"app": [ | 906 ], {"app": [ |
| 871 [new RewriteTransformer("zip", "zap")], | 907 [new RewriteTransformer("zip", "zap")], |
| 872 [new RewriteTransformer("in", "out")], | 908 [new RewriteTransformer("in", "out")], |
| 873 ]}); | 909 ]}); |
| 874 | 910 |
| 875 updateSources(["app|foo.in", "app|bar.zip"]); | 911 updateSources(["app|foo.in", "app|bar.zip"]); |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 953 modifyAsset("app|foo.txt", "bar"); | 989 modifyAsset("app|foo.txt", "bar"); |
| 954 updateSources(["app|foo.txt"]); | 990 updateSources(["app|foo.txt"]); |
| 955 // Ensure we're waiting on [check.isPrimary] | 991 // Ensure we're waiting on [check.isPrimary] |
| 956 schedule(pumpEventQueue); | 992 schedule(pumpEventQueue); |
| 957 | 993 |
| 958 removeSources(["app|foo.txt"]); | 994 removeSources(["app|foo.txt"]); |
| 959 check.resumeIsPrimary("app|foo.txt"); | 995 check.resumeIsPrimary("app|foo.txt"); |
| 960 expectNoAsset("app|foo.txt"); | 996 expectNoAsset("app|foo.txt"); |
| 961 buildShouldSucceed(); | 997 buildShouldSucceed(); |
| 962 }); | 998 }); |
| 999 |
| 1000 test("passes an asset through when its overwriting transform becomes " |
| 1001 "non-primary during apply", () { |
| 1002 var check = new CheckContentTransformer("yes", " modified"); |
| 1003 initGraph({"app|foo.txt": "yes"}, {"app": [[check]]}); |
| 1004 |
| 1005 check.pauseApply(); |
| 1006 updateSources(["app|foo.txt"]); |
| 1007 expectAssetDoesNotComplete("app|foo.txt"); |
| 1008 |
| 1009 modifyAsset("app|foo.txt", "no"); |
| 1010 updateSources(["app|foo.txt"]); |
| 1011 check.resumeApply(); |
| 1012 |
| 1013 expectAsset("app|foo.txt", "no"); |
| 1014 buildShouldSucceed(); |
| 1015 }); |
| 1016 |
| 1017 test("doesn't pass an asset through when its overwriting transform becomes " |
| 1018 "non-primary during apply if another transform overwrites it", () { |
| 1019 var check = new CheckContentTransformer("yes", " modified"); |
| 1020 initGraph({ |
| 1021 "app|foo.txt": "yes" |
| 1022 }, { |
| 1023 "app": [[check, new RewriteTransformer("txt", "txt")]] |
| 1024 }); |
| 1025 |
| 1026 check.pauseApply(); |
| 1027 updateSources(["app|foo.txt"]); |
| 1028 // Ensure we're waiting on [check.apply] |
| 1029 schedule(pumpEventQueue); |
| 1030 |
| 1031 modifyAsset("app|foo.txt", "no"); |
| 1032 updateSources(["app|foo.txt"]); |
| 1033 check.resumeApply(); |
| 1034 |
| 1035 expectAsset("app|foo.txt", "no.txt"); |
| 1036 buildShouldSucceed(); |
| 1037 }); |
| 1038 |
| 1039 test("doesn't pass an asset through when one overwriting transform becomes " |
| 1040 "non-primary if another transform still overwrites it", () { |
| 1041 initGraph({ |
| 1042 "app|foo.txt": "yes" |
| 1043 }, { |
| 1044 "app": [[ |
| 1045 new CheckContentTransformer("yes", " modified"), |
| 1046 new RewriteTransformer("txt", "txt") |
| 1047 ]] |
| 1048 }); |
| 1049 |
| 1050 updateSources(["app|foo.txt"]); |
| 1051 // This could be either the output of [CheckContentTransformer] or |
| 1052 // [RewriteTransformer], depending which completes first. |
| 1053 expectAsset("app|foo.txt", anything); |
| 1054 buildShouldFail([isAssetCollisionException("app|foo.txt")]); |
| 1055 |
| 1056 modifyAsset("app|foo.txt", "no"); |
| 1057 updateSources(["app|foo.txt"]); |
| 1058 expectAsset("app|foo.txt", "no.txt"); |
| 1059 buildShouldSucceed(); |
| 1060 }); |
| 963 }); | 1061 }); |
| 964 | 1062 |
| 965 group('cross-package transforms', () { | 1063 group('cross-package transforms', () { |
| 966 test("can access other packages' source assets", () { | 1064 test("can access other packages' source assets", () { |
| 967 initGraph({ | 1065 initGraph({ |
| 968 "pkg1|a.txt": "pkg2|a.inc", | 1066 "pkg1|a.txt": "pkg2|a.inc", |
| 969 "pkg2|a.inc": "a" | 1067 "pkg2|a.inc": "a" |
| 970 }, {"pkg1": [[new ManyToOneTransformer("txt")]]}); | 1068 }, {"pkg1": [[new ManyToOneTransformer("txt")]]}); |
| 971 | 1069 |
| 972 updateSources(["pkg1|a.txt", "pkg2|a.inc"]); | 1070 updateSources(["pkg1|a.txt", "pkg2|a.inc"]); |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1170 transformer1.resumeApply(); | 1268 transformer1.resumeApply(); |
| 1171 | 1269 |
| 1172 expectAsset("app|foo.out", "foo.mid.out"); | 1270 expectAsset("app|foo.out", "foo.mid.out"); |
| 1173 buildShouldSucceed(); | 1271 buildShouldSucceed(); |
| 1174 | 1272 |
| 1175 expect(transformer1.numRuns, completion(equals(2))); | 1273 expect(transformer1.numRuns, completion(equals(2))); |
| 1176 expect(transformer2.numRuns, completion(equals(2))); | 1274 expect(transformer2.numRuns, completion(equals(2))); |
| 1177 }); | 1275 }); |
| 1178 }); | 1276 }); |
| 1179 } | 1277 } |
| OLD | NEW |