| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  | import { | 
					
						
							|  |  |  |   ddescribe, | 
					
						
							|  |  |  |   describe, | 
					
						
							|  |  |  |   xdescribe, | 
					
						
							|  |  |  |   it, | 
					
						
							|  |  |  |   iit, | 
					
						
							|  |  |  |   xit, | 
					
						
							|  |  |  |   expect, | 
					
						
							|  |  |  |   beforeEach, | 
					
						
							|  |  |  |   afterEach, | 
					
						
							|  |  |  |   AsyncTestCompleter, | 
					
						
							|  |  |  |   inject, | 
					
						
							|  |  |  |   beforeEachProviders | 
					
						
							|  |  |  | } from 'angular2/testing_internal'; | 
					
						
							| 
									
										
										
										
											2015-10-10 22:11:13 -07:00
										 |  |  | import {provide} from 'angular2/src/core/di'; | 
					
						
							| 
									
										
										
										
											2015-11-05 14:07:57 -08:00
										 |  |  | import {SpyXHR} from './spies'; | 
					
						
							|  |  |  | import {XHR} from 'angular2/src/compiler/xhr'; | 
					
						
							| 
									
										
										
										
											2015-11-06 17:34:07 -08:00
										 |  |  | import {BaseException, WrappedException} from 'angular2/src/facade/exceptions'; | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  | import { | 
					
						
							|  |  |  |   CONST_EXPR, | 
					
						
							|  |  |  |   isPresent, | 
					
						
							|  |  |  |   isBlank, | 
					
						
							|  |  |  |   StringWrapper, | 
					
						
							|  |  |  |   isArray, | 
					
						
							|  |  |  |   IS_DART | 
					
						
							|  |  |  | } from 'angular2/src/facade/lang'; | 
					
						
							| 
									
										
										
										
											2016-02-08 13:24:09 -08:00
										 |  |  | import {PromiseWrapper} from 'angular2/src/facade/async'; | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  | import {evalModule} from './eval_module'; | 
					
						
							| 
									
										
										
										
											2015-11-05 14:07:57 -08:00
										 |  |  | import {StyleCompiler} from 'angular2/src/compiler/style_compiler'; | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  | import { | 
					
						
							|  |  |  |   CompileDirectiveMetadata, | 
					
						
							|  |  |  |   CompileTemplateMetadata, | 
					
						
							|  |  |  |   CompileTypeMetadata | 
					
						
							|  |  |  | } from 'angular2/src/compiler/directive_metadata'; | 
					
						
							| 
									
										
										
										
											2015-11-05 14:07:57 -08:00
										 |  |  | import {SourceExpression, SourceModule} from 'angular2/src/compiler/source_module'; | 
					
						
							| 
									
										
										
										
											2015-10-05 10:10:07 -07:00
										 |  |  | import {ViewEncapsulation} from 'angular2/src/core/metadata/view'; | 
					
						
							| 
									
										
										
										
											2015-10-10 22:11:13 -07:00
										 |  |  | import {TEST_PROVIDERS} from './test_bindings'; | 
					
						
							| 
									
										
										
										
											2015-11-05 14:07:57 -08:00
										 |  |  | import {codeGenValueFn, codeGenExportVariable, MODULE_SUFFIX} from 'angular2/src/compiler/util'; | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Attention: These module names have to correspond to real modules!
 | 
					
						
							| 
									
										
										
										
											2015-11-05 14:07:57 -08:00
										 |  |  | var MODULE_URL = `package:angular2/test/compiler/style_compiler_spec${MODULE_SUFFIX}`; | 
					
						
							|  |  |  | var IMPORT_ABS_STYLESHEET_URL = `package:angular2/test/compiler/style_compiler_import.css`; | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  | var IMPORT_REL_STYLESHEET_URL = './style_compiler_import.css'; | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  | // Note: Not a real module, only used via mocks.
 | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  | var IMPORT_ABS_STYLESHEET_URL_WITH_IMPORT = | 
					
						
							| 
									
										
										
										
											2015-11-05 14:07:57 -08:00
										 |  |  |     `package:angular2/test/compiler/style_compiler_transitive_import.css`; | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | export function main() { | 
					
						
							| 
									
										
										
										
											2016-01-25 17:20:06 -08:00
										 |  |  |   // Dart's isolate support is broken, and these tests will be obsolote soon with
 | 
					
						
							|  |  |  |   // https://github.com/angular/angular/issues/6270
 | 
					
						
							|  |  |  |   if (IS_DART) { | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  |   describe('StyleCompiler', () => { | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |     var xhr: SpyXHR; | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-11 14:28:23 +01:00
										 |  |  |     beforeEachProviders(() => { | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  |       xhr = <any>new SpyXHR(); | 
					
						
							| 
									
										
										
										
											2015-10-12 11:30:34 -07:00
										 |  |  |       return [TEST_PROVIDERS, provide(XHR, {useValue: xhr})]; | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |     var compiler: StyleCompiler; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |     beforeEach(inject([StyleCompiler], (_compiler) => { compiler = _compiler; })); | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     describe('compileComponentRuntime', () => { | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |       var xhrUrlResults; | 
					
						
							|  |  |  |       var xhrCount; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       beforeEach(() => { | 
					
						
							|  |  |  |         xhrCount = 0; | 
					
						
							|  |  |  |         xhrUrlResults = {}; | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  |         xhrUrlResults[IMPORT_ABS_STYLESHEET_URL] = 'span {color: blue}'; | 
					
						
							|  |  |  |         xhrUrlResults[IMPORT_ABS_STYLESHEET_URL_WITH_IMPORT] = | 
					
						
							|  |  |  |             `a {color: green}@import ${IMPORT_REL_STYLESHEET_URL};`; | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |       function compile(styles: string[], styleAbsUrls: string[], | 
					
						
							|  |  |  |                        encapsulation: ViewEncapsulation): Promise<string[]> { | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |         // Note: Can't use MockXHR as the xhr is called recursively,
 | 
					
						
							|  |  |  |         // so we can't trigger flush.
 | 
					
						
							|  |  |  |         xhr.spy('get').andCallFake((url) => { | 
					
						
							|  |  |  |           var response = xhrUrlResults[url]; | 
					
						
							|  |  |  |           xhrCount++; | 
					
						
							|  |  |  |           if (isBlank(response)) { | 
					
						
							|  |  |  |             throw new BaseException(`Unexpected url ${url}`); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           return PromiseWrapper.resolve(response); | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  |         }); | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |         return compiler.compileComponentRuntime(new CompileTemplateMetadata( | 
					
						
							|  |  |  |             {styles: styles, styleUrls: styleAbsUrls, encapsulation: encapsulation})); | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       describe('no shim', () => { | 
					
						
							|  |  |  |         var encapsulation = ViewEncapsulation.None; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |         it('should compile plain css rules', inject([AsyncTestCompleter], (async) => { | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |              compile(['div {color: red}', 'span {color: blue}'], [], encapsulation) | 
					
						
							|  |  |  |                  .then(styles => { | 
					
						
							|  |  |  |                    expect(styles).toEqual(['div {color: red}', 'span {color: blue}']); | 
					
						
							|  |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |            })); | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |         it('should allow to import rules', inject([AsyncTestCompleter], (async) => { | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  |              compile(['div {color: red}'], [IMPORT_ABS_STYLESHEET_URL], encapsulation) | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |                  .then(styles => { | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |                    expect(styles).toEqual(['div {color: red}', ['span {color: blue}']]); | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							|  |  |  |            })); | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |         it('should allow to import rules transitively', inject([AsyncTestCompleter], (async) => { | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  |              compile(['div {color: red}'], [IMPORT_ABS_STYLESHEET_URL_WITH_IMPORT], encapsulation) | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |                  .then(styles => { | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |                    expect(styles) | 
					
						
							|  |  |  |                        .toEqual(['div {color: red}', ['a {color: green}', ['span {color: blue}']]]); | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							|  |  |  |            })); | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       describe('with shim', () => { | 
					
						
							|  |  |  |         var encapsulation = ViewEncapsulation.Emulated; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |         it('should compile plain css rules', inject([AsyncTestCompleter], (async) => { | 
					
						
							|  |  |  |              compile(['div {\ncolor: red;\n}', 'span {\ncolor: blue;\n}'], [], encapsulation) | 
					
						
							|  |  |  |                  .then(styles => { | 
					
						
							| 
									
										
										
										
											2015-09-24 14:34:40 +02:00
										 |  |  |                    compareStyles(styles, [ | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |                      'div[_ngcontent-%COMP%] {\ncolor: red;\n}', | 
					
						
							|  |  |  |                      'span[_ngcontent-%COMP%] {\ncolor: blue;\n}' | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |                    ]); | 
					
						
							|  |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							|  |  |  |            })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should allow to import rules', inject([AsyncTestCompleter], (async) => { | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  |              compile(['div {\ncolor: red;\n}'], [IMPORT_ABS_STYLESHEET_URL], encapsulation) | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |                  .then(styles => { | 
					
						
							| 
									
										
										
										
											2015-09-24 14:34:40 +02:00
										 |  |  |                    compareStyles(styles, [ | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |                      'div[_ngcontent-%COMP%] {\ncolor: red;\n}', | 
					
						
							|  |  |  |                      ['span[_ngcontent-%COMP%] {color: blue}'] | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |                    ]); | 
					
						
							|  |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							|  |  |  |            })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should allow to import rules transitively', inject([AsyncTestCompleter], (async) => { | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |              compile(['div {\ncolor: red;\n}'], [IMPORT_ABS_STYLESHEET_URL_WITH_IMPORT], | 
					
						
							|  |  |  |                      encapsulation) | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |                  .then(styles => { | 
					
						
							| 
									
										
										
										
											2015-09-24 14:34:40 +02:00
										 |  |  |                    compareStyles(styles, [ | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |                      'div[_ngcontent-%COMP%] {\ncolor: red;\n}', | 
					
						
							|  |  |  |                      [ | 
					
						
							|  |  |  |                        'a[_ngcontent-%COMP%] {color: green}', | 
					
						
							|  |  |  |                        ['span[_ngcontent-%COMP%] {color: blue}'] | 
					
						
							|  |  |  |                      ] | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |                    ]); | 
					
						
							|  |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							|  |  |  |            })); | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should cache stylesheets for parallel requests', inject([AsyncTestCompleter], (async) => { | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |            PromiseWrapper.all([ | 
					
						
							|  |  |  |                            compile([], [IMPORT_ABS_STYLESHEET_URL], ViewEncapsulation.None), | 
					
						
							|  |  |  |                            compile([], [IMPORT_ABS_STYLESHEET_URL], ViewEncapsulation.None) | 
					
						
							|  |  |  |                          ]) | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |                .then((styleArrays) => { | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |                  expect(styleArrays[0]).toEqual([['span {color: blue}']]); | 
					
						
							|  |  |  |                  expect(styleArrays[1]).toEqual([['span {color: blue}']]); | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |                  expect(xhrCount).toBe(1); | 
					
						
							|  |  |  |                  async.done(); | 
					
						
							|  |  |  |                }); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should cache stylesheets for serial requests', inject([AsyncTestCompleter], (async) => { | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |            compile([], [IMPORT_ABS_STYLESHEET_URL], ViewEncapsulation.None) | 
					
						
							|  |  |  |                .then((styles0) => { | 
					
						
							|  |  |  |                  xhrUrlResults[IMPORT_ABS_STYLESHEET_URL] = 'span {color: black}'; | 
					
						
							|  |  |  |                  return compile([], [IMPORT_ABS_STYLESHEET_URL], ViewEncapsulation.None) | 
					
						
							|  |  |  |                      .then((styles1) => { | 
					
						
							|  |  |  |                        expect(styles0).toEqual([['span {color: blue}']]); | 
					
						
							|  |  |  |                        expect(styles1).toEqual([['span {color: blue}']]); | 
					
						
							|  |  |  |                        expect(xhrCount).toBe(1); | 
					
						
							|  |  |  |                        async.done(); | 
					
						
							|  |  |  |                      }); | 
					
						
							|  |  |  |                }); | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should allow to clear the cache', inject([AsyncTestCompleter], (async) => { | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  |            compile([], [IMPORT_ABS_STYLESHEET_URL], ViewEncapsulation.None) | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |                .then((_) => { | 
					
						
							|  |  |  |                  compiler.clearCache(); | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  |                  xhrUrlResults[IMPORT_ABS_STYLESHEET_URL] = 'span {color: black}'; | 
					
						
							|  |  |  |                  return compile([], [IMPORT_ABS_STYLESHEET_URL], ViewEncapsulation.None); | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |                }) | 
					
						
							|  |  |  |                .then((styles) => { | 
					
						
							|  |  |  |                  expect(xhrCount).toBe(2); | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |                  expect(styles).toEqual([['span {color: black}']]); | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |                  async.done(); | 
					
						
							|  |  |  |                }); | 
					
						
							|  |  |  |          })); | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('compileComponentCodeGen', () => { | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |       function compile(styles: string[], styleAbsUrls: string[], | 
					
						
							|  |  |  |                        encapsulation: ViewEncapsulation): Promise<string[]> { | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |         var sourceExpression = compiler.compileComponentCodeGen(new CompileTemplateMetadata( | 
					
						
							|  |  |  |             {styles: styles, styleUrls: styleAbsUrls, encapsulation: encapsulation})); | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |         var sourceWithImports = testableExpression(sourceExpression).getSourceWithImports(); | 
					
						
							|  |  |  |         return evalModule(sourceWithImports.source, sourceWithImports.imports, null); | 
					
						
							|  |  |  |       }; | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       describe('no shim', () => { | 
					
						
							|  |  |  |         var encapsulation = ViewEncapsulation.None; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-28 10:30:33 -07:00
										 |  |  |         it('should compile plain css rules', inject([AsyncTestCompleter], (async) => { | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |              compile(['div {color: red}', 'span {color: blue}'], [], encapsulation) | 
					
						
							|  |  |  |                  .then(styles => { | 
					
						
							|  |  |  |                    expect(styles).toEqual(['div {color: red}', 'span {color: blue}']); | 
					
						
							|  |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |            })); | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         it('should compile css rules with newlines and quotes', | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |            inject([AsyncTestCompleter], (async) => { | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |              compile(['div\n{"color": \'red\'}'], [], encapsulation) | 
					
						
							|  |  |  |                  .then(styles => { | 
					
						
							|  |  |  |                    expect(styles).toEqual(['div\n{"color": \'red\'}']); | 
					
						
							|  |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |            })); | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |         it('should allow to import rules', inject([AsyncTestCompleter], (async) => { | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  |              compile(['div {color: red}'], [IMPORT_ABS_STYLESHEET_URL], encapsulation) | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |                  .then(styles => { | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |                    expect(styles).toEqual(['div {color: red}', ['span {color: blue}']]); | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							| 
									
										
										
										
											2015-09-24 14:34:40 +02:00
										 |  |  |            }), 1000); | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       describe('with shim', () => { | 
					
						
							|  |  |  |         var encapsulation = ViewEncapsulation.Emulated; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |         it('should compile plain css ruless', inject([AsyncTestCompleter], (async) => { | 
					
						
							|  |  |  |              compile(['div {\ncolor: red;\n}', 'span {\ncolor: blue;\n}'], [], encapsulation) | 
					
						
							|  |  |  |                  .then(styles => { | 
					
						
							| 
									
										
										
										
											2015-09-24 14:34:40 +02:00
										 |  |  |                    compareStyles(styles, [ | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |                      'div[_ngcontent-%COMP%] {\ncolor: red;\n}', | 
					
						
							|  |  |  |                      'span[_ngcontent-%COMP%] {\ncolor: blue;\n}' | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |                    ]); | 
					
						
							|  |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							|  |  |  |            })); | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |         it('should allow to import rules', inject([AsyncTestCompleter], (async) => { | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  |              compile(['div {color: red}'], [IMPORT_ABS_STYLESHEET_URL], encapsulation) | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |                  .then(styles => { | 
					
						
							| 
									
										
										
										
											2015-09-24 14:34:40 +02:00
										 |  |  |                    compareStyles(styles, [ | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |                      'div[_ngcontent-%COMP%] {color: red}', | 
					
						
							|  |  |  |                      ['span[_ngcontent-%COMP%] {\ncolor: blue;\n}'] | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |                    ]); | 
					
						
							|  |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							| 
									
										
										
										
											2015-09-24 14:34:40 +02:00
										 |  |  |            }), 1000); | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('compileStylesheetCodeGen', () => { | 
					
						
							| 
									
										
										
										
											2015-09-24 14:34:40 +02:00
										 |  |  |       function compile(style: string): Promise<string[][]> { | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  |         var sourceModules = compiler.compileStylesheetCodeGen(MODULE_URL, style); | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |         return PromiseWrapper.all(sourceModules.map(sourceModule => { | 
					
						
							|  |  |  |           var sourceWithImports = testableModule(sourceModule).getSourceWithImports(); | 
					
						
							|  |  |  |           return evalModule(sourceWithImports.source, sourceWithImports.imports, null); | 
					
						
							|  |  |  |         })); | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |       it('should compile plain css rules', inject([AsyncTestCompleter], (async) => { | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |            compile('div {color: red;}') | 
					
						
							|  |  |  |                .then(stylesAndShimStyles => { | 
					
						
							|  |  |  |                  var expected = [['div {color: red;}'], ['div[_ngcontent-%COMP%] {color: red;}']]; | 
					
						
							|  |  |  |                  compareStyles(stylesAndShimStyles[0], expected[0]); | 
					
						
							|  |  |  |                  compareStyles(stylesAndShimStyles[1], expected[1]); | 
					
						
							|  |  |  |                  async.done(); | 
					
						
							|  |  |  |                }); | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |          })); | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should allow to import rules with relative paths', | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |          inject([AsyncTestCompleter], (async) => { | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  |            compile(`div {color: red}@import ${IMPORT_REL_STYLESHEET_URL};`) | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |                .then(stylesAndShimStyles => { | 
					
						
							| 
									
										
										
										
											2015-09-24 14:34:40 +02:00
										 |  |  |                  var expected = [ | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |                    ['div {color: red}', ['span {color: blue}']], | 
					
						
							| 
									
										
										
										
											2015-09-24 14:34:40 +02:00
										 |  |  |                    [ | 
					
						
							| 
									
										
										
										
											2015-10-29 10:57:54 -07:00
										 |  |  |                      'div[_ngcontent-%COMP%] {color: red}', | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |                      ['span[_ngcontent-%COMP%] {\ncolor: blue;\n}'] | 
					
						
							| 
									
										
										
										
											2015-09-24 14:34:40 +02:00
										 |  |  |                    ] | 
					
						
							|  |  |  |                  ]; | 
					
						
							|  |  |  |                  compareStyles(stylesAndShimStyles[0], expected[0]); | 
					
						
							|  |  |  |                  compareStyles(stylesAndShimStyles[1], expected[1]); | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |                  async.done(); | 
					
						
							|  |  |  |                }); | 
					
						
							|  |  |  |          })); | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | function testableExpression(source: SourceExpression): SourceModule { | 
					
						
							|  |  |  |   var testableSource = `${source.declarations.join('\n')}
 | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |   ${codeGenValueFn(['_'], source.expression, '_run')}; | 
					
						
							|  |  |  |   ${codeGenExportVariable('run')}_run;`;
 | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |   return new SourceModule(null, testableSource); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function testableModule(sourceModule: SourceModule): SourceModule { | 
					
						
							| 
									
										
										
										
											2015-09-17 09:58:18 -07:00
										 |  |  |   var testableSource = `${sourceModule.sourceWithModuleRefs}
 | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |   ${codeGenValueFn(['_'], 'STYLES', '_run')}; | 
					
						
							|  |  |  |   ${codeGenExportVariable('run')}_run;`;
 | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  |   return new SourceModule(sourceModule.moduleUrl, testableSource); | 
					
						
							| 
									
										
										
										
											2015-09-02 15:07:31 -07:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-09-08 17:36:59 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Needed for Android browsers which add an extra space at the end of some lines
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  | function compareStyles(styles: Array<string | any[]>, expectedStyles: Array<string | any[]>) { | 
					
						
							| 
									
										
										
										
											2015-09-08 17:36:59 +02:00
										 |  |  |   expect(styles.length).toEqual(expectedStyles.length); | 
					
						
							|  |  |  |   for (var i = 0; i < styles.length; i++) { | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |     var style = styles[i]; | 
					
						
							|  |  |  |     if (isArray(style)) { | 
					
						
							|  |  |  |       compareStyles(<any[]>style, <any[]>expectedStyles[i]); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       expect(StringWrapper.replaceAll(<string>style, /\s+\n/g, '\n')).toEqual(expectedStyles[i]); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-09-08 17:36:59 +02:00
										 |  |  |   } | 
					
						
							|  |  |  | } |