2016-04-28 20:50:03 -04:00
import { describe , it , expect , beforeEach , ddescribe , iit , xit } from '@angular/core/testing' ;
import { getDOM } from '@angular/platform-browser/src/dom/dom_adapter' ;
import { SelectorMatcher } from '@angular/compiler/src/selector' ;
import { CssSelector } from '@angular/compiler/src/selector' ;
import { el } from '@angular/platform-browser/testing' ;
2014-10-28 17:46:55 -04:00
export function main() {
describe ( 'SelectorMatcher' , ( ) = > {
2016-06-08 18:45:15 -04:00
var matcher : any /** TODO #9100 */ , selectableCollector : any /** TODO #9100 */ , s1 : any /** TODO #9100 */ , s2 : any /** TODO #9100 */ , s3 : any /** TODO #9100 */ , s4 : any /** TODO #9100 */ ;
2015-06-17 14:17:21 -04:00
var matched : any [ ] ;
2014-10-28 17:46:55 -04:00
2015-06-17 14:17:21 -04:00
function reset() { matched = [ ] ; }
2014-10-28 17:46:55 -04:00
beforeEach ( ( ) = > {
reset ( ) ;
2015-02-06 18:41:02 -05:00
s1 = s2 = s3 = s4 = null ;
2016-06-08 18:45:15 -04:00
selectableCollector = ( selector : any /** TODO #9100 */ , context : any /** TODO #9100 */ ) = > {
2015-06-17 14:17:21 -04:00
matched . push ( selector ) ;
matched . push ( context ) ;
2015-05-26 12:25:39 -04:00
} ;
2014-10-28 17:46:55 -04:00
matcher = new SelectorMatcher ( ) ;
} ) ;
2015-11-23 19:02:19 -05:00
it ( 'should select by element name case sensitive' , ( ) = > {
2015-03-19 12:01:42 -04:00
matcher . addSelectables ( s1 = CssSelector . parse ( 'someTag' ) , 1 ) ;
2014-10-28 17:46:55 -04:00
2015-05-26 12:25:39 -04:00
expect ( matcher . match ( CssSelector . parse ( 'SOMEOTHERTAG' ) [ 0 ] , selectableCollector ) )
. toEqual ( false ) ;
2014-10-28 17:46:55 -04:00
expect ( matched ) . toEqual ( [ ] ) ;
2015-11-23 19:02:19 -05:00
expect ( matcher . match ( CssSelector . parse ( 'SOMETAG' ) [ 0 ] , selectableCollector ) ) . toEqual ( false ) ;
expect ( matched ) . toEqual ( [ ] ) ;
expect ( matcher . match ( CssSelector . parse ( 'someTag' ) [ 0 ] , selectableCollector ) ) . toEqual ( true ) ;
2015-05-26 12:25:39 -04:00
expect ( matched ) . toEqual ( [ s1 [ 0 ] , 1 ] ) ;
2014-10-28 17:46:55 -04:00
} ) ;
it ( 'should select by class name case insensitive' , ( ) = > {
2015-03-19 12:01:42 -04:00
matcher . addSelectables ( s1 = CssSelector . parse ( '.someClass' ) , 1 ) ;
matcher . addSelectables ( s2 = CssSelector . parse ( '.someClass.class2' ) , 2 ) ;
2014-10-28 17:46:55 -04:00
2015-05-26 12:25:39 -04:00
expect ( matcher . match ( CssSelector . parse ( '.SOMEOTHERCLASS' ) [ 0 ] , selectableCollector ) )
. toEqual ( false ) ;
2014-10-28 17:46:55 -04:00
expect ( matched ) . toEqual ( [ ] ) ;
2015-03-19 12:01:42 -04:00
expect ( matcher . match ( CssSelector . parse ( '.SOMECLASS' ) [ 0 ] , selectableCollector ) ) . toEqual ( true ) ;
2015-05-26 12:25:39 -04:00
expect ( matched ) . toEqual ( [ s1 [ 0 ] , 1 ] ) ;
2014-10-28 17:46:55 -04:00
reset ( ) ;
2015-05-26 12:25:39 -04:00
expect ( matcher . match ( CssSelector . parse ( '.someClass.class2' ) [ 0 ] , selectableCollector ) )
. toEqual ( true ) ;
expect ( matched ) . toEqual ( [ s1 [ 0 ] , 1 , s2 [ 0 ] , 2 ] ) ;
2014-10-28 17:46:55 -04:00
} ) ;
2015-11-23 19:02:19 -05:00
it ( 'should select by attr name case sensitive independent of the value' , ( ) = > {
2015-03-19 12:01:42 -04:00
matcher . addSelectables ( s1 = CssSelector . parse ( '[someAttr]' ) , 1 ) ;
matcher . addSelectables ( s2 = CssSelector . parse ( '[someAttr][someAttr2]' ) , 2 ) ;
2014-10-28 17:46:55 -04:00
2015-05-26 12:25:39 -04:00
expect ( matcher . match ( CssSelector . parse ( '[SOMEOTHERATTR]' ) [ 0 ] , selectableCollector ) )
. toEqual ( false ) ;
2014-10-28 17:46:55 -04:00
expect ( matched ) . toEqual ( [ ] ) ;
2015-11-23 19:02:19 -05:00
expect ( matcher . match ( CssSelector . parse ( '[SOMEATTR]' ) [ 0 ] , selectableCollector ) ) . toEqual ( false ) ;
expect ( matched ) . toEqual ( [ ] ) ;
2014-10-28 17:46:55 -04:00
2015-05-26 12:25:39 -04:00
expect ( matcher . match ( CssSelector . parse ( '[SOMEATTR=someValue]' ) [ 0 ] , selectableCollector ) )
2015-11-23 19:02:19 -05:00
. toEqual ( false ) ;
expect ( matched ) . toEqual ( [ ] ) ;
2014-11-11 20:33:47 -05:00
2015-05-26 12:25:39 -04:00
expect ( matcher . match ( CssSelector . parse ( '[someAttr][someAttr2]' ) [ 0 ] , selectableCollector ) )
. toEqual ( true ) ;
expect ( matched ) . toEqual ( [ s1 [ 0 ] , 1 , s2 [ 0 ] , 2 ] ) ;
2015-06-11 14:35:02 -04:00
reset ( ) ;
2016-04-12 12:40:37 -04:00
expect ( matcher . match ( CssSelector . parse ( '[someAttr=someValue][someAttr2]' ) [ 0 ] ,
selectableCollector ) )
2015-06-11 14:35:02 -04:00
. toEqual ( true ) ;
expect ( matched ) . toEqual ( [ s1 [ 0 ] , 1 , s2 [ 0 ] , 2 ] ) ;
reset ( ) ;
2016-04-12 12:40:37 -04:00
expect ( matcher . match ( CssSelector . parse ( '[someAttr2][someAttr=someValue]' ) [ 0 ] ,
selectableCollector ) )
2015-06-11 14:35:02 -04:00
. toEqual ( true ) ;
expect ( matched ) . toEqual ( [ s1 [ 0 ] , 1 , s2 [ 0 ] , 2 ] ) ;
reset ( ) ;
2016-04-12 12:40:37 -04:00
expect ( matcher . match ( CssSelector . parse ( '[someAttr2=someValue][someAttr]' ) [ 0 ] ,
selectableCollector ) )
2015-06-11 14:35:02 -04:00
. toEqual ( true ) ;
expect ( matched ) . toEqual ( [ s1 [ 0 ] , 1 , s2 [ 0 ] , 2 ] ) ;
2014-10-28 17:46:55 -04:00
} ) ;
2014-11-11 20:33:47 -05:00
it ( 'should select by attr name only once if the value is from the DOM' , ( ) = > {
2015-03-19 12:01:42 -04:00
matcher . addSelectables ( s1 = CssSelector . parse ( '[some-decor]' ) , 1 ) ;
2014-11-11 20:33:47 -05:00
var elementSelector = new CssSelector ( ) ;
2015-01-08 12:11:33 -05:00
var element = el ( '<div attr></div>' ) ;
2016-04-28 20:50:03 -04:00
var empty = getDOM ( ) . getAttribute ( element , 'attr' ) ;
2014-11-11 20:33:47 -05:00
elementSelector . addAttribute ( 'some-decor' , empty ) ;
matcher . match ( elementSelector , selectableCollector ) ;
2015-05-26 12:25:39 -04:00
expect ( matched ) . toEqual ( [ s1 [ 0 ] , 1 ] ) ;
2014-11-11 20:33:47 -05:00
} ) ;
2015-11-23 19:02:19 -05:00
it ( 'should select by attr name case sensitive and value case insensitive' , ( ) = > {
2015-03-19 12:01:42 -04:00
matcher . addSelectables ( s1 = CssSelector . parse ( '[someAttr=someValue]' ) , 1 ) ;
2014-10-28 17:46:55 -04:00
2015-05-26 12:25:39 -04:00
expect ( matcher . match ( CssSelector . parse ( '[SOMEATTR=SOMEOTHERATTR]' ) [ 0 ] , selectableCollector ) )
. toEqual ( false ) ;
2014-10-28 17:46:55 -04:00
expect ( matched ) . toEqual ( [ ] ) ;
2015-05-26 12:25:39 -04:00
expect ( matcher . match ( CssSelector . parse ( '[SOMEATTR=SOMEVALUE]' ) [ 0 ] , selectableCollector ) )
2015-11-23 19:02:19 -05:00
. toEqual ( false ) ;
expect ( matched ) . toEqual ( [ ] ) ;
expect ( matcher . match ( CssSelector . parse ( '[someAttr=SOMEVALUE]' ) [ 0 ] , selectableCollector ) )
2015-05-26 12:25:39 -04:00
. toEqual ( true ) ;
expect ( matched ) . toEqual ( [ s1 [ 0 ] , 1 ] ) ;
2014-10-28 17:46:55 -04:00
} ) ;
it ( 'should select by element name, class name and attribute name with value' , ( ) = > {
2015-03-19 12:01:42 -04:00
matcher . addSelectables ( s1 = CssSelector . parse ( 'someTag.someClass[someAttr=someValue]' ) , 1 ) ;
2014-10-28 17:46:55 -04:00
2016-04-12 12:40:37 -04:00
expect ( matcher . match ( CssSelector . parse ( 'someOtherTag.someOtherClass[someOtherAttr]' ) [ 0 ] ,
selectableCollector ) )
2015-05-26 12:25:39 -04:00
. toEqual ( false ) ;
2014-10-28 17:46:55 -04:00
expect ( matched ) . toEqual ( [ ] ) ;
2016-04-12 12:40:37 -04:00
expect ( matcher . match ( CssSelector . parse ( 'someTag.someOtherClass[someOtherAttr]' ) [ 0 ] ,
selectableCollector ) )
2015-05-26 12:25:39 -04:00
. toEqual ( false ) ;
2014-10-28 17:46:55 -04:00
expect ( matched ) . toEqual ( [ ] ) ;
2016-04-12 12:40:37 -04:00
expect ( matcher . match ( CssSelector . parse ( 'someTag.someClass[someOtherAttr]' ) [ 0 ] ,
selectableCollector ) )
2015-05-26 12:25:39 -04:00
. toEqual ( false ) ;
2014-10-28 17:46:55 -04:00
expect ( matched ) . toEqual ( [ ] ) ;
2015-05-26 12:25:39 -04:00
expect (
matcher . match ( CssSelector . parse ( 'someTag.someClass[someAttr]' ) [ 0 ] , selectableCollector ) )
. toEqual ( false ) ;
2014-10-28 17:46:55 -04:00
expect ( matched ) . toEqual ( [ ] ) ;
2016-04-12 12:40:37 -04:00
expect ( matcher . match ( CssSelector . parse ( 'someTag.someClass[someAttr=someValue]' ) [ 0 ] ,
selectableCollector ) )
2015-05-26 12:25:39 -04:00
. toEqual ( true ) ;
expect ( matched ) . toEqual ( [ s1 [ 0 ] , 1 ] ) ;
2014-10-28 17:46:55 -04:00
} ) ;
2015-03-19 18:38:48 -04:00
it ( 'should select by many attributes and independent of the value' , ( ) = > {
matcher . addSelectables ( s1 = CssSelector . parse ( 'input[type=text][control]' ) , 1 ) ;
var cssSelector = new CssSelector ( ) ;
cssSelector . setElement ( 'input' ) ;
cssSelector . addAttribute ( 'type' , 'text' ) ;
cssSelector . addAttribute ( 'control' , 'one' ) ;
expect ( matcher . match ( cssSelector , selectableCollector ) ) . toEqual ( true ) ;
expect ( matched ) . toEqual ( [ s1 [ 0 ] , 1 ] ) ;
} ) ;
2014-10-28 17:46:55 -04:00
it ( 'should select independent of the order in the css selector' , ( ) = > {
2015-03-19 12:01:42 -04:00
matcher . addSelectables ( s1 = CssSelector . parse ( '[someAttr].someClass' ) , 1 ) ;
matcher . addSelectables ( s2 = CssSelector . parse ( '.someClass[someAttr]' ) , 2 ) ;
matcher . addSelectables ( s3 = CssSelector . parse ( '.class1.class2' ) , 3 ) ;
matcher . addSelectables ( s4 = CssSelector . parse ( '.class2.class1' ) , 4 ) ;
2014-10-28 17:46:55 -04:00
2015-05-26 12:25:39 -04:00
expect ( matcher . match ( CssSelector . parse ( '[someAttr].someClass' ) [ 0 ] , selectableCollector ) )
. toEqual ( true ) ;
expect ( matched ) . toEqual ( [ s1 [ 0 ] , 1 , s2 [ 0 ] , 2 ] ) ;
2014-10-28 17:46:55 -04:00
reset ( ) ;
2015-05-26 12:25:39 -04:00
expect ( matcher . match ( CssSelector . parse ( '.someClass[someAttr]' ) [ 0 ] , selectableCollector ) )
. toEqual ( true ) ;
expect ( matched ) . toEqual ( [ s1 [ 0 ] , 1 , s2 [ 0 ] , 2 ] ) ;
2014-10-28 17:46:55 -04:00
reset ( ) ;
2015-05-26 12:25:39 -04:00
expect ( matcher . match ( CssSelector . parse ( '.class1.class2' ) [ 0 ] , selectableCollector ) )
. toEqual ( true ) ;
expect ( matched ) . toEqual ( [ s3 [ 0 ] , 3 , s4 [ 0 ] , 4 ] ) ;
2014-10-28 17:46:55 -04:00
reset ( ) ;
2015-05-26 12:25:39 -04:00
expect ( matcher . match ( CssSelector . parse ( '.class2.class1' ) [ 0 ] , selectableCollector ) )
. toEqual ( true ) ;
expect ( matched ) . toEqual ( [ s4 [ 0 ] , 4 , s3 [ 0 ] , 3 ] ) ;
2014-10-28 17:46:55 -04:00
} ) ;
2015-03-12 04:44:49 -04:00
it ( 'should not select with a matching :not selector' , ( ) = > {
2015-03-19 12:01:42 -04:00
matcher . addSelectables ( CssSelector . parse ( 'p:not(.someClass)' ) , 1 ) ;
matcher . addSelectables ( CssSelector . parse ( 'p:not([someAttr])' ) , 2 ) ;
matcher . addSelectables ( CssSelector . parse ( ':not(.someClass)' ) , 3 ) ;
matcher . addSelectables ( CssSelector . parse ( ':not(p)' ) , 4 ) ;
matcher . addSelectables ( CssSelector . parse ( ':not(p[someAttr])' ) , 5 ) ;
2015-03-12 04:44:49 -04:00
2015-05-26 12:25:39 -04:00
expect ( matcher . match ( CssSelector . parse ( 'p.someClass[someAttr]' ) [ 0 ] , selectableCollector ) )
. toEqual ( false ) ;
2015-03-12 04:44:49 -04:00
expect ( matched ) . toEqual ( [ ] ) ;
} ) ;
it ( 'should select with a non matching :not selector' , ( ) = > {
2015-03-19 12:01:42 -04:00
matcher . addSelectables ( s1 = CssSelector . parse ( 'p:not(.someClass)' ) , 1 ) ;
matcher . addSelectables ( s2 = CssSelector . parse ( 'p:not(.someOtherClass[someAttr])' ) , 2 ) ;
matcher . addSelectables ( s3 = CssSelector . parse ( ':not(.someClass)' ) , 3 ) ;
matcher . addSelectables ( s4 = CssSelector . parse ( ':not(.someOtherClass[someAttr])' ) , 4 ) ;
2015-03-12 04:44:49 -04:00
2016-04-12 12:40:37 -04:00
expect ( matcher . match ( CssSelector . parse ( 'p[someOtherAttr].someOtherClass' ) [ 0 ] ,
selectableCollector ) )
2015-05-26 12:25:39 -04:00
. toEqual ( true ) ;
expect ( matched ) . toEqual ( [ s1 [ 0 ] , 1 , s2 [ 0 ] , 2 , s3 [ 0 ] , 3 , s4 [ 0 ] , 4 ] ) ;
2015-03-19 12:01:42 -04:00
} ) ;
2015-06-01 17:24:19 -04:00
it ( 'should match with multiple :not selectors' , ( ) = > {
matcher . addSelectables ( s1 = CssSelector . parse ( 'div:not([a]):not([b])' ) , 1 ) ;
expect ( matcher . match ( CssSelector . parse ( 'div[a]' ) [ 0 ] , selectableCollector ) ) . toBe ( false ) ;
expect ( matcher . match ( CssSelector . parse ( 'div[b]' ) [ 0 ] , selectableCollector ) ) . toBe ( false ) ;
expect ( matcher . match ( CssSelector . parse ( 'div[c]' ) [ 0 ] , selectableCollector ) ) . toBe ( true ) ;
} ) ;
2015-03-19 12:01:42 -04:00
it ( 'should select with one match in a list' , ( ) = > {
2015-05-26 12:25:39 -04:00
matcher . addSelectables ( s1 = CssSelector . parse ( 'input[type=text], textbox' ) , 1 ) ;
2015-03-19 12:01:42 -04:00
2015-05-26 12:25:39 -04:00
expect ( matcher . match ( CssSelector . parse ( 'textbox' ) [ 0 ] , selectableCollector ) ) . toEqual ( true ) ;
expect ( matched ) . toEqual ( [ s1 [ 1 ] , 1 ] ) ;
2015-03-19 12:01:42 -04:00
2015-05-26 12:25:39 -04:00
reset ( ) ;
expect ( matcher . match ( CssSelector . parse ( 'input[type=text]' ) [ 0 ] , selectableCollector ) )
. toEqual ( true ) ;
expect ( matched ) . toEqual ( [ s1 [ 0 ] , 1 ] ) ;
2015-03-19 12:01:42 -04:00
} ) ;
it ( 'should not select twice with two matches in a list' , ( ) = > {
2015-05-26 12:25:39 -04:00
matcher . addSelectables ( s1 = CssSelector . parse ( 'input, .someClass' ) , 1 ) ;
2015-03-19 12:01:42 -04:00
2015-05-26 12:25:39 -04:00
expect ( matcher . match ( CssSelector . parse ( 'input.someclass' ) [ 0 ] , selectableCollector ) )
. toEqual ( true ) ;
expect ( matched . length ) . toEqual ( 2 ) ;
expect ( matched ) . toEqual ( [ s1 [ 0 ] , 1 ] ) ;
2015-03-12 04:44:49 -04:00
} ) ;
2014-10-28 17:46:55 -04:00
} ) ;
describe ( 'CssSelector.parse' , ( ) = > {
it ( 'should detect element names' , ( ) = > {
2015-03-19 12:01:42 -04:00
var cssSelector = CssSelector . parse ( 'sometag' ) [ 0 ] ;
2014-10-28 17:46:55 -04:00
expect ( cssSelector . element ) . toEqual ( 'sometag' ) ;
expect ( cssSelector . toString ( ) ) . toEqual ( 'sometag' ) ;
} ) ;
it ( 'should detect class names' , ( ) = > {
2015-03-19 12:01:42 -04:00
var cssSelector = CssSelector . parse ( '.someClass' ) [ 0 ] ;
2014-10-28 17:46:55 -04:00
expect ( cssSelector . classNames ) . toEqual ( [ 'someclass' ] ) ;
expect ( cssSelector . toString ( ) ) . toEqual ( '.someclass' ) ;
} ) ;
it ( 'should detect attr names' , ( ) = > {
2015-03-19 12:01:42 -04:00
var cssSelector = CssSelector . parse ( '[attrname]' ) [ 0 ] ;
2014-11-11 20:33:47 -05:00
expect ( cssSelector . attrs ) . toEqual ( [ 'attrname' , '' ] ) ;
expect ( cssSelector . toString ( ) ) . toEqual ( '[attrname]' ) ;
2014-10-28 17:46:55 -04:00
} ) ;
it ( 'should detect attr values' , ( ) = > {
2015-03-19 12:01:42 -04:00
var cssSelector = CssSelector . parse ( '[attrname=attrvalue]' ) [ 0 ] ;
2014-11-11 20:33:47 -05:00
expect ( cssSelector . attrs ) . toEqual ( [ 'attrname' , 'attrvalue' ] ) ;
2014-10-28 17:46:55 -04:00
expect ( cssSelector . toString ( ) ) . toEqual ( '[attrname=attrvalue]' ) ;
} ) ;
it ( 'should detect multiple parts' , ( ) = > {
2015-03-19 12:01:42 -04:00
var cssSelector = CssSelector . parse ( 'sometag[attrname=attrvalue].someclass' ) [ 0 ] ;
2014-10-28 17:46:55 -04:00
expect ( cssSelector . element ) . toEqual ( 'sometag' ) ;
2014-11-11 20:33:47 -05:00
expect ( cssSelector . attrs ) . toEqual ( [ 'attrname' , 'attrvalue' ] ) ;
2014-10-28 17:46:55 -04:00
expect ( cssSelector . classNames ) . toEqual ( [ 'someclass' ] ) ;
expect ( cssSelector . toString ( ) ) . toEqual ( 'sometag.someclass[attrname=attrvalue]' ) ;
} ) ;
2015-03-12 04:44:49 -04:00
2015-03-19 18:38:48 -04:00
it ( 'should detect multiple attributes' , ( ) = > {
var cssSelector = CssSelector . parse ( 'input[type=text][control]' ) [ 0 ] ;
expect ( cssSelector . element ) . toEqual ( 'input' ) ;
expect ( cssSelector . attrs ) . toEqual ( [ 'type' , 'text' , 'control' , '' ] ) ;
expect ( cssSelector . toString ( ) ) . toEqual ( 'input[type=text][control]' ) ;
} ) ;
2015-03-12 04:44:49 -04:00
it ( 'should detect :not' , ( ) = > {
2015-03-19 12:01:42 -04:00
var cssSelector = CssSelector . parse ( 'sometag:not([attrname=attrvalue].someclass)' ) [ 0 ] ;
2015-03-12 04:44:49 -04:00
expect ( cssSelector . element ) . toEqual ( 'sometag' ) ;
expect ( cssSelector . attrs . length ) . toEqual ( 0 ) ;
expect ( cssSelector . classNames . length ) . toEqual ( 0 ) ;
2015-06-01 17:24:19 -04:00
var notSelector = cssSelector . notSelectors [ 0 ] ;
2015-03-12 04:44:49 -04:00
expect ( notSelector . element ) . toEqual ( null ) ;
expect ( notSelector . attrs ) . toEqual ( [ 'attrname' , 'attrvalue' ] ) ;
expect ( notSelector . classNames ) . toEqual ( [ 'someclass' ] ) ;
expect ( cssSelector . toString ( ) ) . toEqual ( 'sometag:not(.someclass[attrname=attrvalue])' ) ;
} ) ;
it ( 'should detect :not without truthy' , ( ) = > {
2015-03-19 12:01:42 -04:00
var cssSelector = CssSelector . parse ( ':not([attrname=attrvalue].someclass)' ) [ 0 ] ;
2016-04-12 12:40:37 -04:00
expect ( cssSelector . element ) . toEqual ( "*" ) ;
2015-03-12 04:44:49 -04:00
2015-06-01 17:24:19 -04:00
var notSelector = cssSelector . notSelectors [ 0 ] ;
2015-03-12 04:44:49 -04:00
expect ( notSelector . attrs ) . toEqual ( [ 'attrname' , 'attrvalue' ] ) ;
expect ( notSelector . classNames ) . toEqual ( [ 'someclass' ] ) ;
expect ( cssSelector . toString ( ) ) . toEqual ( '*:not(.someclass[attrname=attrvalue])' ) ;
} ) ;
it ( 'should throw when nested :not' , ( ) = > {
2016-04-12 12:40:37 -04:00
expect ( ( ) = > { CssSelector . parse ( 'sometag:not(:not([attrname=attrvalue].someclass))' ) [ 0 ] ; } )
. toThrowError ( 'Nesting :not is not allowed in a selector' ) ;
2015-03-12 04:44:49 -04:00
} ) ;
2015-03-19 12:01:42 -04:00
2015-06-01 17:24:19 -04:00
it ( 'should throw when multiple selectors in :not' , ( ) = > {
2016-04-12 12:40:37 -04:00
expect ( ( ) = > { CssSelector . parse ( 'sometag:not(a,b)' ) ; } )
. toThrowError ( 'Multiple selectors in :not are not supported' ) ;
2015-06-01 17:24:19 -04:00
} ) ;
2015-03-19 12:01:42 -04:00
it ( 'should detect lists of selectors' , ( ) = > {
var cssSelectors = CssSelector . parse ( '.someclass,[attrname=attrvalue], sometag' ) ;
expect ( cssSelectors . length ) . toEqual ( 3 ) ;
expect ( cssSelectors [ 0 ] . classNames ) . toEqual ( [ 'someclass' ] ) ;
expect ( cssSelectors [ 1 ] . attrs ) . toEqual ( [ 'attrname' , 'attrvalue' ] ) ;
expect ( cssSelectors [ 2 ] . element ) . toEqual ( 'sometag' ) ;
} ) ;
it ( 'should detect lists of selectors with :not' , ( ) = > {
2015-05-26 12:25:39 -04:00
var cssSelectors =
CssSelector . parse ( 'input[type=text], :not(textarea), textbox:not(.special)' ) ;
2015-03-19 12:01:42 -04:00
expect ( cssSelectors . length ) . toEqual ( 3 ) ;
expect ( cssSelectors [ 0 ] . element ) . toEqual ( 'input' ) ;
expect ( cssSelectors [ 0 ] . attrs ) . toEqual ( [ 'type' , 'text' ] ) ;
expect ( cssSelectors [ 1 ] . element ) . toEqual ( '*' ) ;
2015-06-01 17:24:19 -04:00
expect ( cssSelectors [ 1 ] . notSelectors [ 0 ] . element ) . toEqual ( 'textarea' ) ;
2015-03-19 12:01:42 -04:00
expect ( cssSelectors [ 2 ] . element ) . toEqual ( 'textbox' ) ;
2015-06-01 17:24:19 -04:00
expect ( cssSelectors [ 2 ] . notSelectors [ 0 ] . classNames ) . toEqual ( [ 'special' ] ) ;
2015-03-19 12:01:42 -04:00
} ) ;
2014-10-28 17:46:55 -04:00
} ) ;
2015-07-28 14:38:40 -04:00
describe ( 'CssSelector.getMatchingElementTemplate' , ( ) = > {
2015-11-23 19:02:19 -05:00
it ( 'should create an element with a tagName, classes, and attributes with the correct casing' ,
( ) = > {
let selector = CssSelector . parse ( 'Blink.neon.hotpink[Sweet][Dismissable=false]' ) [ 0 ] ;
let template = selector . getMatchingElementTemplate ( ) ;
2015-07-28 14:38:40 -04:00
2015-11-23 19:02:19 -05:00
expect ( template ) . toEqual ( '<Blink class="neon hotpink" Sweet Dismissable="false"></Blink>' ) ;
} ) ;
2015-07-28 14:38:40 -04:00
it ( 'should create an element without a tag name' , ( ) = > {
let selector = CssSelector . parse ( '[fancy]' ) [ 0 ] ;
let template = selector . getMatchingElementTemplate ( ) ;
expect ( template ) . toEqual ( '<div fancy></div>' ) ;
} ) ;
it ( 'should ignore :not selectors' , ( ) = > {
let selector = CssSelector . parse ( 'grape:not(.red)' ) [ 0 ] ;
let template = selector . getMatchingElementTemplate ( ) ;
expect ( template ) . toEqual ( '<grape></grape>' ) ;
} ) ;
} ) ;
2015-06-01 17:24:19 -04:00
}