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