| 
									
										
										
										
											2013-08-30 00:50:57 +08:00
										 |  |  | describe('UNIT: Expression Parser', function () { | 
					
						
							| 
									
										
										
										
											2013-11-13 02:45:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-08 06:29:17 +08:00
										 |  |  |     var ExpParser = require('vue/src/exp-parser') | 
					
						
							| 
									
										
										
										
											2013-08-30 00:50:57 +08:00
										 |  |  |      | 
					
						
							|  |  |  |     var testCases = [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             // string concat
 | 
					
						
							|  |  |  |             exp: 'a + b', | 
					
						
							|  |  |  |             vm: { | 
					
						
							|  |  |  |                 a: 'hello', | 
					
						
							|  |  |  |                 b: 'world' | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             expectedValue: 'helloworld' | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             // math
 | 
					
						
							|  |  |  |             exp: 'a - b * 2 + 45', | 
					
						
							|  |  |  |             vm: { | 
					
						
							|  |  |  |                 a: 100, | 
					
						
							|  |  |  |                 b: 23 | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             expectedValue: 100 - 23 * 2 + 45 | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             // boolean logic
 | 
					
						
							|  |  |  |             exp: '(a && b) ? c : d || e', | 
					
						
							|  |  |  |             vm: { | 
					
						
							|  |  |  |                 a: true, | 
					
						
							|  |  |  |                 b: false, | 
					
						
							|  |  |  |                 c: null, | 
					
						
							|  |  |  |                 d: false, | 
					
						
							|  |  |  |                 e: 'worked' | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             expectedValue: 'worked' | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             // inline string
 | 
					
						
							|  |  |  |             exp: "a + 'hello'", | 
					
						
							|  |  |  |             vm: { | 
					
						
							|  |  |  |                 a: 'inline ' | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             expectedValue: 'inline hello' | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             // complex with nested values
 | 
					
						
							|  |  |  |             exp: "todo.title + ' : ' + (todo.done ? 'yep' : 'nope')", | 
					
						
							| 
									
										
										
										
											2013-10-22 02:17:20 +08:00
										 |  |  |             paths: ['todo.title', 'todo.done'], | 
					
						
							| 
									
										
										
										
											2013-08-30 00:50:57 +08:00
										 |  |  |             vm: { | 
					
						
							|  |  |  |                 todo: { | 
					
						
							|  |  |  |                     title: 'write tests', | 
					
						
							|  |  |  |                     done: false | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             expectedValue: 'write tests : nope' | 
					
						
							| 
									
										
										
										
											2013-11-16 00:46:24 +08:00
										 |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2013-12-24 03:47:51 +08:00
										 |  |  |             // expression with no data variables
 | 
					
						
							| 
									
										
										
										
											2013-11-16 00:46:24 +08:00
										 |  |  |             exp: "'a' + 'b'", | 
					
						
							|  |  |  |             vm: {}, | 
					
						
							|  |  |  |             expectedValue: 'ab' | 
					
						
							| 
									
										
										
										
											2014-01-09 00:40:31 +08:00
										 |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             // values with same variable name inside strings
 | 
					
						
							|  |  |  |             exp: "'\"test\"' + test + \"'hi'\" + hi", | 
					
						
							|  |  |  |             vm: { | 
					
						
							|  |  |  |                 test: 1, | 
					
						
							|  |  |  |                 hi: 2 | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             expectedValue: '"test"1\'hi\'2' | 
					
						
							| 
									
										
										
										
											2013-08-30 00:50:57 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     testCases.forEach(describeCase) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function describeCase (testCase) { | 
					
						
							|  |  |  |         describe(testCase.exp, function () { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-22 06:27:54 +08:00
										 |  |  |             function createBinding (path) { | 
					
						
							|  |  |  |                 caughtMissingPaths.push(path) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-19 04:14:54 +08:00
										 |  |  |             var caughtMissingPaths = [], | 
					
						
							|  |  |  |                 compilerMock = { | 
					
						
							| 
									
										
										
										
											2014-01-22 06:27:54 +08:00
										 |  |  |                     createBinding: createBinding, | 
					
						
							| 
									
										
										
										
											2014-01-22 10:43:08 +08:00
										 |  |  |                     hasKey: function () {}, | 
					
						
							| 
									
										
										
										
											2013-11-19 04:14:54 +08:00
										 |  |  |                     vm:{ | 
					
						
							| 
									
										
										
										
											2013-12-24 03:47:51 +08:00
										 |  |  |                         $data: {}, | 
					
						
							| 
									
										
										
										
											2013-11-19 04:14:54 +08:00
										 |  |  |                         $compiler:{ | 
					
						
							|  |  |  |                             bindings:{}, | 
					
						
							| 
									
										
										
										
											2014-01-22 06:27:54 +08:00
										 |  |  |                             createBinding: createBinding | 
					
						
							| 
									
										
										
										
											2013-11-19 04:14:54 +08:00
										 |  |  |                         } | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 getter = ExpParser.parse(testCase.exp, compilerMock), | 
					
						
							| 
									
										
										
										
											2013-08-30 00:50:57 +08:00
										 |  |  |                 vm     = testCase.vm, | 
					
						
							| 
									
										
										
										
											2013-10-22 02:17:20 +08:00
										 |  |  |                 vars   = testCase.paths || Object.keys(vm) | 
					
						
							| 
									
										
										
										
											2013-08-30 00:50:57 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-19 04:14:54 +08:00
										 |  |  |             it('should get correct paths', function () { | 
					
						
							| 
									
										
										
										
											2013-11-16 00:46:24 +08:00
										 |  |  |                 if (!vars.length) return | 
					
						
							| 
									
										
										
										
											2013-11-19 04:14:54 +08:00
										 |  |  |                 assert.strictEqual(caughtMissingPaths.length, vars.length) | 
					
						
							| 
									
										
										
										
											2013-08-30 00:50:57 +08:00
										 |  |  |                 for (var i = 0; i < vars.length; i++) { | 
					
						
							| 
									
										
										
										
											2013-11-19 04:14:54 +08:00
										 |  |  |                     assert.strictEqual(vars[i], caughtMissingPaths[i]) | 
					
						
							| 
									
										
										
										
											2013-08-30 00:50:57 +08:00
										 |  |  |                 } | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             it('should generate correct getter function', function () { | 
					
						
							| 
									
										
										
										
											2013-11-19 04:14:54 +08:00
										 |  |  |                 var value = getter.call(vm) | 
					
						
							| 
									
										
										
										
											2013-08-30 00:50:57 +08:00
										 |  |  |                 assert.strictEqual(value, testCase.expectedValue) | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-16 00:46:24 +08:00
										 |  |  |     // extra case for invalid expressions
 | 
					
						
							|  |  |  |     describe('invalid expression', function () { | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         it('should capture the error and warn', function () { | 
					
						
							| 
									
										
										
										
											2013-12-08 06:29:17 +08:00
										 |  |  |             var utils = require('vue/src/utils'), | 
					
						
							| 
									
										
										
										
											2013-11-16 00:46:24 +08:00
										 |  |  |                 oldWarn = utils.warn, | 
					
						
							|  |  |  |                 warned = false | 
					
						
							|  |  |  |             utils.warn = function () { | 
					
						
							|  |  |  |                 warned = true | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2014-01-22 10:43:08 +08:00
										 |  |  |             function noop () {} | 
					
						
							| 
									
										
										
										
											2013-11-19 04:14:54 +08:00
										 |  |  |             ExpParser.parse('a + "fsef', { | 
					
						
							| 
									
										
										
										
											2014-01-22 10:43:08 +08:00
										 |  |  |                 createBinding: noop, | 
					
						
							|  |  |  |                 hasKey: noop, | 
					
						
							| 
									
										
										
										
											2013-11-19 04:14:54 +08:00
										 |  |  |                 vm: { | 
					
						
							|  |  |  |                     $compiler: { | 
					
						
							|  |  |  |                         bindings: {}, | 
					
						
							| 
									
										
										
										
											2014-01-22 10:43:08 +08:00
										 |  |  |                         createBinding: noop | 
					
						
							| 
									
										
										
										
											2013-12-23 17:54:02 +08:00
										 |  |  |                     }, | 
					
						
							| 
									
										
										
										
											2013-12-24 03:47:51 +08:00
										 |  |  |                     $data: {} | 
					
						
							| 
									
										
										
										
											2013-11-19 04:14:54 +08:00
										 |  |  |                 } | 
					
						
							|  |  |  |             }) | 
					
						
							| 
									
										
										
										
											2013-11-16 00:46:24 +08:00
										 |  |  |             assert.ok(warned) | 
					
						
							|  |  |  |             utils.warn = oldWarn | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-30 00:50:57 +08:00
										 |  |  | }) |