Index: third_party/pkg/angular/test/core_dom/view_spec.dart |
diff --git a/third_party/pkg/angular/test/core_dom/view_spec.dart b/third_party/pkg/angular/test/core_dom/view_spec.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..678dc80009e0114eddfd2028b40effc2091bb84b |
--- /dev/null |
+++ b/third_party/pkg/angular/test/core_dom/view_spec.dart |
@@ -0,0 +1,239 @@ |
+library view_spec; |
+ |
+import '../_specs.dart'; |
+import 'package:angular/application_factory.dart'; |
+ |
+class Log { |
+ List<String> log = <String>[]; |
+ |
+ add(String msg) => log.add(msg); |
+} |
+ |
+@Decorator(children: Directive.TRANSCLUDE_CHILDREN, selector: 'foo') |
+class LoggerViewDirective { |
+ LoggerViewDirective(ViewPort port, ViewFactory viewFactory, |
+ BoundViewFactory boundViewFactory, Logger logger) { |
+ assert(port != null); |
+ assert(viewFactory != null); |
+ assert(boundViewFactory != null); |
+ |
+ logger.add(port); |
+ logger.add(boundViewFactory); |
+ logger.add(viewFactory); |
+ } |
+} |
+ |
+@Decorator(selector: 'dir-a') |
+class ADirective { |
+ ADirective(Log log) { |
+ log.add('ADirective'); |
+ } |
+} |
+ |
+@Decorator(selector: 'dir-b') |
+class BDirective { |
+ BDirective(Log log) { |
+ log.add('BDirective'); |
+ } |
+} |
+ |
+@Formatter(name:'filterA') |
+class AFilter { |
+ Log log; |
+ |
+ AFilter(this.log) { |
+ log.add('AFilter'); |
+ } |
+ |
+ call(value) => value; |
+} |
+ |
+@Formatter(name:'filterB') |
+class BFilter { |
+ Log log; |
+ |
+ BFilter(this.log) { |
+ log.add('BFilter'); |
+ } |
+ |
+ call(value) => value; |
+} |
+ |
+ |
+main() { |
+ var viewFactoryFactory = (a,b,c,d) => new WalkingViewFactory(a,b,c,d); |
+ describe('View', () { |
+ var anchor; |
+ Element rootElement; |
+ var viewCache; |
+ |
+ beforeEach(() { |
+ rootElement = e('<div></div>'); |
+ }); |
+ |
+ describe('mutation', () { |
+ var a, b; |
+ var expando = new Expando(); |
+ |
+ beforeEach((Injector injector, Profiler perf) { |
+ rootElement.innerHtml = '<!-- anchor -->'; |
+ anchor = new ViewPort(rootElement.childNodes[0], |
+ injector.get(Animate)); |
+ a = (viewFactoryFactory(es('<span>A</span>a'), [], perf, expando))(injector); |
+ b = (viewFactoryFactory(es('<span>B</span>b'), [], perf, expando))(injector); |
+ }); |
+ |
+ |
+ describe('insertAfter', () { |
+ it('should insert block after anchor view', () { |
+ anchor.insert(a); |
+ |
+ expect(rootElement).toHaveHtml('<!-- anchor --><span>A</span>a'); |
+ }); |
+ |
+ |
+ it('should insert multi element view after another multi element view', () { |
+ anchor.insert(a); |
+ anchor.insert(b, insertAfter: a); |
+ |
+ expect(rootElement).toHaveHtml('<!-- anchor --><span>A</span>a<span>B</span>b'); |
+ }); |
+ |
+ |
+ it('should insert multi element view before another multi element view', () { |
+ anchor.insert(b); |
+ anchor.insert(a); |
+ |
+ expect(rootElement).toHaveHtml('<!-- anchor --><span>A</span>a<span>B</span>b'); |
+ }); |
+ }); |
+ |
+ |
+ describe('remove', () { |
+ beforeEach(() { |
+ anchor.insert(a); |
+ anchor.insert(b, insertAfter: a); |
+ |
+ expect(rootElement.text).toEqual('AaBb'); |
+ }); |
+ |
+ it('should remove the last view', () { |
+ anchor.remove(b); |
+ expect(rootElement).toHaveHtml('<!-- anchor --><span>A</span>a'); |
+ }); |
+ |
+ it('should remove child views from parent pseudo black', () { |
+ anchor.remove(a); |
+ expect(rootElement).toHaveHtml('<!-- anchor --><span>B</span>b'); |
+ }); |
+ |
+ // TODO(deboer): Make this work again. |
+ /* |
+ xit('should remove', (Logger logger, Injector injector, Profiler perf, ElementBinderFactory ebf) { |
+ anchor.remove(a); |
+ anchor.remove(b); |
+ |
+ // TODO(dart): I really want to do this: |
+ // class Directive { |
+ // Directive(ViewPort $anchor, Logger logger) { |
+ // logger.add($anchor); |
+ // } |
+ // } |
+ |
+ var directiveRef = new DirectiveRef(null, |
+ LoggerViewDirective, |
+ new Decorator(children: Directive.TRANSCLUDE_CHILDREN, selector: 'foo'), |
+ ''); |
+ directiveRef.viewFactory = viewFactoryFactory($('<b>text</b>'), [], perf, new Expando()); |
+ var binder = ebf.binder(); |
+ binder.setTemplateInfo(0, [ directiveRef ]); |
+ var outerViewType = viewFactoryFactory( |
+ $('<!--start--><!--end-->'), |
+ [binder], |
+ perf, |
+ new Expando()); |
+ |
+ var outerView = outerViewType(injector); |
+ // The LoggerViewDirective caused a ViewPort for innerViewType to |
+ // be created at logger[0]; |
+ ViewPort outerAnchor = logger[0]; |
+ BoundViewFactory outterBoundViewFactory = logger[1]; |
+ |
+ anchor.insert(outerView); |
+ // outterAnchor is a ViewPort, but it has "elements" set to the 0th element |
+ // of outerViewType. So, calling insertAfter() will insert the new |
+ // view after the <!--start--> element. |
+ outerAnchor.insert(outterBoundViewFactory(null)); |
+ |
+ expect(rootElement.text).toEqual('text'); |
+ |
+ anchor.remove(outerView); |
+ |
+ expect(rootElement.text).toEqual(''); |
+ }); |
+ */ |
+ }); |
+ |
+ |
+ describe('moveAfter', () { |
+ beforeEach(() { |
+ anchor.insert(a); |
+ anchor.insert(b, insertAfter: a); |
+ |
+ expect(rootElement.text).toEqual('AaBb'); |
+ }); |
+ |
+ |
+ it('should move last to middle', () { |
+ anchor.move(a, moveAfter: b); |
+ expect(rootElement).toHaveHtml('<!-- anchor --><span>B</span>b<span>A</span>a'); |
+ }); |
+ }); |
+ }); |
+ |
+ describe('deferred', () { |
+ |
+ it('should load directives/formatters from the child injector', () { |
+ Module rootModule = new Module() |
+ ..type(Probe) |
+ ..type(Log) |
+ ..type(AFilter) |
+ ..type(ADirective) |
+ ..factory(Node, (injector) => document.body); |
+ |
+ Injector rootInjector = applicationFactory() |
+ .addModule(rootModule) |
+ .createInjector(); |
+ Log log = rootInjector.get(Log); |
+ Scope rootScope = rootInjector.get(Scope); |
+ |
+ Compiler compiler = rootInjector.get(Compiler); |
+ DirectiveMap directives = rootInjector.get(DirectiveMap); |
+ compiler(es('<dir-a>{{\'a\' | filterA}}</dir-a><dir-b></dir-b>'), directives)(rootInjector); |
+ rootScope.apply(); |
+ |
+ expect(log.log, equals(['ADirective', 'AFilter'])); |
+ |
+ |
+ Module childModule = new Module() |
+ ..type(BFilter) |
+ ..type(BDirective); |
+ |
+ var childInjector = forceNewDirectivesAndFilters(rootInjector, [childModule]); |
+ |
+ DirectiveMap newDirectives = childInjector.get(DirectiveMap); |
+ compiler(es('<dir-a probe="dirA"></dir-a>{{\'a\' | filterA}}' |
+ '<dir-b probe="dirB"></dir-b>{{\'b\' | filterB}}'), newDirectives)(childInjector); |
+ rootScope.apply(); |
+ |
+ expect(log.log, equals(['ADirective', 'AFilter', 'ADirective', 'BDirective', 'BFilter'])); |
+ }); |
+ |
+ }); |
+ |
+ //TODO: tests for attach/detach |
+ //TODO: animation/transitions |
+ //TODO: tests for re-usability of views |
+ |
+ }); |
+} |