1+ describe ( 'syntax parser' , function ( ) {
2+
3+ var typeaheadParser , scope , filterFilter ;
4+
5+ beforeEach ( module ( 'ui.bootstrap.typeahead' ) ) ;
6+ beforeEach ( inject ( function ( _$rootScope_ , _filterFilter_ , _typeaheadParser_ ) {
7+ typeaheadParser = _typeaheadParser_ ;
8+ scope = _$rootScope_ ;
9+ filterFilter = _filterFilter_ ;
10+ } ) ) ;
11+
12+ it ( 'should parse the simplest array-based syntax' , function ( ) {
13+ scope . states = [ 'Alabama' , 'California' , 'Delaware' ] ;
14+ var result = typeaheadParser . parse ( 'state for state in states | filter:$viewValue' ) ;
15+
16+ var itemName = result . itemName ;
17+ var locals = { $viewValue :'al' } ;
18+ expect ( result . source ( scope , locals ) ) . toEqual ( [ 'Alabama' , 'California' ] ) ;
19+
20+ locals [ itemName ] = 'Alabama' ;
21+ expect ( result . viewMapper ( scope , locals ) ) . toEqual ( 'Alabama' ) ;
22+ expect ( result . modelMapper ( scope , locals ) ) . toEqual ( 'Alabama' ) ;
23+ } ) ;
24+
25+ it ( 'should parse the simplest function-based syntax' , function ( ) {
26+ scope . getStates = function ( $viewValue ) {
27+ return filterFilter ( [ 'Alabama' , 'California' , 'Delaware' ] , $viewValue ) ;
28+ } ;
29+ var result = typeaheadParser . parse ( 'state for state in getStates($viewValue)' ) ;
30+
31+ var itemName = result . itemName ;
32+ var locals = { $viewValue :'al' } ;
33+ expect ( result . source ( scope , locals ) ) . toEqual ( [ 'Alabama' , 'California' ] ) ;
34+
35+ locals [ itemName ] = 'Alabama' ;
36+ expect ( result . viewMapper ( scope , locals ) ) . toEqual ( 'Alabama' ) ;
37+ expect ( result . modelMapper ( scope , locals ) ) . toEqual ( 'Alabama' ) ;
38+ } ) ;
39+
40+ it ( 'should allow to specify custom model mapping that is used as a label as well' , function ( ) {
41+
42+ scope . states = [
43+ { code :'AL' , name :'Alabama' } ,
44+ { code :'CA' , name :'California' } ,
45+ { code :'DE' , name :'Delaware' }
46+ ] ;
47+ var result = typeaheadParser . parse ( "state.name for state in states | filter:$viewValue | orderBy:'name':true" ) ;
48+
49+ var itemName = result . itemName ;
50+ expect ( itemName ) . toEqual ( 'state' ) ;
51+ expect ( result . source ( scope , { $viewValue :'al' } ) ) . toEqual ( [
52+ { code :'CA' , name :'California' } ,
53+ { code :'AL' , name :'Alabama' }
54+ ] ) ;
55+
56+ var locals = { $viewValue :'al' } ;
57+ locals [ itemName ] = { code :'AL' , name :'Alabama' } ;
58+ expect ( result . viewMapper ( scope , locals ) ) . toEqual ( 'Alabama' ) ;
59+ expect ( result . modelMapper ( scope , locals ) ) . toEqual ( 'Alabama' ) ;
60+ } ) ;
61+
62+ it ( 'should allow to specify custom view and model mappers' , function ( ) {
63+
64+ scope . states = [
65+ { code :'AL' , name :'Alabama' } ,
66+ { code :'CA' , name :'California' } ,
67+ { code :'DE' , name :'Delaware' }
68+ ] ;
69+ var result = typeaheadParser . parse ( "state.code as state.name + ' ('+state.code+')' for state in states | filter:$viewValue | orderBy:'name':true" ) ;
70+
71+ var itemName = result . itemName ;
72+ expect ( result . source ( scope , { $viewValue :'al' } ) ) . toEqual ( [
73+ { code :'CA' , name :'California' } ,
74+ { code :'AL' , name :'Alabama' }
75+ ] ) ;
76+
77+ var locals = { $viewValue :'al' } ;
78+ locals [ itemName ] = { code :'AL' , name :'Alabama' } ;
79+ expect ( result . viewMapper ( scope , locals ) ) . toEqual ( 'Alabama (AL)' ) ;
80+ expect ( result . modelMapper ( scope , locals ) ) . toEqual ( 'AL' ) ;
81+ } ) ;
82+ } ) ;
0 commit comments