mirror of https://github.com/vuejs/vue.git
unit test for new exp-parser implementation
This commit is contained in:
parent
bc0fd377d5
commit
b4902ae757
|
|
@ -38,21 +38,16 @@ function getVariables (code) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Filter
|
* A given path could potentially exist not on the
|
||||||
|
* current compiler, but up in the parent chain somewhere.
|
||||||
|
* This function generates an access relationship string
|
||||||
|
* that can be used in the getter function by walking up
|
||||||
|
* the parent chain to check for key existence.
|
||||||
|
*
|
||||||
|
* It stops at top parent if no vm in the chain has the
|
||||||
|
* key. It then creates any missing bindings on the
|
||||||
|
* final resolved vm.
|
||||||
*/
|
*/
|
||||||
function filterUnique (vars) {
|
|
||||||
var hash = utils.hash(),
|
|
||||||
i = vars.length,
|
|
||||||
key, res = []
|
|
||||||
while (i--) {
|
|
||||||
key = vars[i]
|
|
||||||
if (hash[key]) continue
|
|
||||||
hash[key] = 1
|
|
||||||
res.push(key)
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
function getRel (path, compiler) {
|
function getRel (path, compiler) {
|
||||||
var rel = '',
|
var rel = '',
|
||||||
vm = compiler.vm,
|
vm = compiler.vm,
|
||||||
|
|
@ -108,7 +103,7 @@ module.exports = {
|
||||||
if (!vars.length) {
|
if (!vars.length) {
|
||||||
return makeGetter('return ' + exp, exp)
|
return makeGetter('return ' + exp, exp)
|
||||||
}
|
}
|
||||||
vars = filterUnique(vars)
|
vars = utils.unique(vars)
|
||||||
var pathRE = new RegExp("\\b(" + vars.join('|') + ")[$\\w\\.]*\\b", 'g'),
|
var pathRE = new RegExp("\\b(" + vars.join('|') + ")[$\\w\\.]*\\b", 'g'),
|
||||||
body = 'return ' + exp.replace(pathRE, function (path) {
|
body = 'return ' + exp.replace(pathRE, function (path) {
|
||||||
return 'this.' + getRel(path, compiler) + path
|
return 'this.' + getRel(path, compiler) + path
|
||||||
|
|
|
||||||
16
src/utils.js
16
src/utils.js
|
|
@ -78,6 +78,22 @@ var utils = module.exports = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* filter an array with duplicates into uniques
|
||||||
|
*/
|
||||||
|
unique: function (arr) {
|
||||||
|
var hash = utils.hash(),
|
||||||
|
i = arr.length,
|
||||||
|
key, res = []
|
||||||
|
while (i--) {
|
||||||
|
key = arr[i]
|
||||||
|
if (hash[key]) continue
|
||||||
|
hash[key] = 1
|
||||||
|
res.push(key)
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert a string template to a dom fragment
|
* Convert a string template to a dom fragment
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,18 @@ describe('UNIT: Expression Parser', function () {
|
||||||
function describeCase (testCase) {
|
function describeCase (testCase) {
|
||||||
describe(testCase.exp, function () {
|
describe(testCase.exp, function () {
|
||||||
|
|
||||||
var result = ExpParser.parse(testCase.exp),
|
var caughtMissingPaths = [],
|
||||||
|
compilerMock = {
|
||||||
|
vm:{
|
||||||
|
$compiler:{
|
||||||
|
bindings:{},
|
||||||
|
createBinding: function (path) {
|
||||||
|
caughtMissingPaths.push(path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getter = ExpParser.parse(testCase.exp, compilerMock),
|
||||||
vm = testCase.vm,
|
vm = testCase.vm,
|
||||||
vars = testCase.paths || Object.keys(vm)
|
vars = testCase.paths || Object.keys(vm)
|
||||||
|
|
||||||
|
|
@ -74,16 +85,16 @@ describe('UNIT: Expression Parser', function () {
|
||||||
// the real $get() will be tested in integration tests.
|
// the real $get() will be tested in integration tests.
|
||||||
vm.$get = function (key) { return this[key] }
|
vm.$get = function (key) { return this[key] }
|
||||||
|
|
||||||
it('should get correct args', function () {
|
it('should get correct paths', function () {
|
||||||
if (!vars.length) return
|
if (!vars.length) return
|
||||||
assert.strictEqual(result.paths.length, vars.length)
|
assert.strictEqual(caughtMissingPaths.length, vars.length)
|
||||||
for (var i = 0; i < vars.length; i++) {
|
for (var i = 0; i < vars.length; i++) {
|
||||||
assert.strictEqual(vars[i], result.paths[i])
|
assert.strictEqual(vars[i], caughtMissingPaths[i])
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should generate correct getter function', function () {
|
it('should generate correct getter function', function () {
|
||||||
var value = result.getter.call(vm)
|
var value = getter.call(vm)
|
||||||
assert.strictEqual(value, testCase.expectedValue)
|
assert.strictEqual(value, testCase.expectedValue)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -100,7 +111,14 @@ describe('UNIT: Expression Parser', function () {
|
||||||
utils.warn = function () {
|
utils.warn = function () {
|
||||||
warned = true
|
warned = true
|
||||||
}
|
}
|
||||||
ExpParser.parse('a + "fsef')
|
ExpParser.parse('a + "fsef', {
|
||||||
|
vm: {
|
||||||
|
$compiler: {
|
||||||
|
bindings: {},
|
||||||
|
createBinding: function () {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
assert.ok(warned)
|
assert.ok(warned)
|
||||||
utils.warn = oldWarn
|
utils.warn = oldWarn
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -129,6 +129,20 @@ describe('UNIT: Utils', function () {
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('unique', function () {
|
||||||
|
|
||||||
|
it('should filter an array with duplicates into unqiue ones', function () {
|
||||||
|
var arr = [1, 2, 3, 1, 2, 3, 4, 5],
|
||||||
|
res = utils.unique(arr),
|
||||||
|
l = res.length
|
||||||
|
assert.strictEqual(l, 5)
|
||||||
|
while (l--) {
|
||||||
|
assert.strictEqual(res[l], 5 - l)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
describe('toFragment', function () {
|
describe('toFragment', function () {
|
||||||
|
|
||||||
it('should convert a string tempalte to a documentFragment', function () {
|
it('should convert a string tempalte to a documentFragment', function () {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue