117 lines
3.0 KiB
JavaScript
117 lines
3.0 KiB
JavaScript
"use strict"
|
|
|
|
const assert = require("assert")
|
|
const acorn = require("acorn")
|
|
const logicalAssignments = require("..")
|
|
const Parser = acorn.Parser.extend(logicalAssignments)
|
|
|
|
function test(text, expectedResult, additionalOptions) {
|
|
it(text, function () {
|
|
const result = Parser.parse(text, Object.assign({ ecmaVersion: 11 }, additionalOptions))
|
|
assert.deepStrictEqual(result.body[0], expectedResult)
|
|
})
|
|
}
|
|
function testFail(text, expectedError, additionalOptions) {
|
|
it(text, function () {
|
|
let failed = false
|
|
try {
|
|
Parser.parse(text, Object.assign({ ecmaVersion: 11 }, additionalOptions))
|
|
} catch (e) {
|
|
assert.strictEqual(e.message, expectedError)
|
|
failed = true
|
|
}
|
|
assert(failed)
|
|
})
|
|
}
|
|
|
|
const newNode = (start, props) => Object.assign(new acorn.Node({options: {}}, start), props)
|
|
|
|
describe("acorn-logical-assignments", function () {
|
|
const lhs = [
|
|
{d: "x", ast: start => newNode(start, {
|
|
type: "Identifier",
|
|
start: 0,
|
|
end: 1,
|
|
name: "x"
|
|
})},
|
|
{d: "x.y", ast: start => newNode(start, {
|
|
type: "MemberExpression",
|
|
start: 0,
|
|
end: 3,
|
|
object: newNode(0, {
|
|
type: "Identifier",
|
|
start: 0,
|
|
end: 1,
|
|
name: "x"
|
|
}),
|
|
property: newNode(0, {
|
|
type: "Identifier",
|
|
start: 2,
|
|
end: 3,
|
|
name: "y"
|
|
}),
|
|
computed: false
|
|
})},
|
|
{d: "var x", error: "Unexpected token (1:5)"},
|
|
{d: "{ x }", error: "Unexpected token (1:5)"},
|
|
{d: "() => {}", error: "Assigning to rvalue (1:0)"},
|
|
{d: "'use strict'; arguments", error: "Assigning to arguments in strict mode (1:14)"},
|
|
{d: "/x/", error: "Assigning to rvalue (1:0)"},
|
|
]
|
|
const getRight = start => newNode(start, {
|
|
type: "Identifier",
|
|
start: start,
|
|
end: start + 1,
|
|
name: "x"
|
|
})
|
|
const ops = [
|
|
{s: "&&=", ast: content => newNode(0, {
|
|
type: "ExpressionStatement",
|
|
start: 0,
|
|
end: content.end + 4,
|
|
expression: newNode(0, {
|
|
type: "AssignmentExpression",
|
|
start: 0,
|
|
end: content.end + 4,
|
|
operator: "&&=",
|
|
left: content,
|
|
right: getRight(content.end + 3)
|
|
})
|
|
})},
|
|
{s: "||=", ast: content => newNode(0, {
|
|
type: "ExpressionStatement",
|
|
start: 0,
|
|
end: content.end + 4,
|
|
expression: newNode(0, {
|
|
type: "AssignmentExpression",
|
|
start: 0,
|
|
end: content.end + 4,
|
|
operator: "||=",
|
|
left: content,
|
|
right: getRight(content.end + 3)
|
|
})
|
|
})},
|
|
{s: "??=", ast: content => newNode(0, {
|
|
type: "ExpressionStatement",
|
|
start: 0,
|
|
end: content.end + 4,
|
|
expression: newNode(0, {
|
|
type: "AssignmentExpression",
|
|
start: 0,
|
|
end: content.end + 4,
|
|
operator: "??=",
|
|
left: content,
|
|
right: getRight(content.end + 3)
|
|
})
|
|
})},
|
|
]
|
|
ops.forEach(op => {
|
|
lhs.forEach(d => {
|
|
(d.error ? testFail : test)(
|
|
`${d.d}${op.s}x`,
|
|
d.error || op.ast(d.ast(0))
|
|
)
|
|
})
|
|
})
|
|
})
|