function testSyntax(script) {
    try {
        eval(script);
    } catch (error) {
        if (error instanceof SyntaxError)
            throw new Error("Bad error: " + String(error));
    }
}

function testSyntaxError(script, message) {
    var error = null;
    try {
        eval(script);
    } catch (e) {
        error = e;
    }
    if (!error)
        throw new Error("Expected syntax error not thrown");

    if (String(error) !== message)
        throw new Error("Bad error: " + String(error));
}

{
    let tokens = [
        '-',
        '+',
        '~',
        '!',
        'typeof',
        'void',
        'delete',
    ];

    for (let token of tokens) {
        testSyntaxError(`
        function pow(a, b)
        {
            return ${token} a ** b;
        }
        `, `SyntaxError: Unexpected token '**'. Ambiguous unary expression in the left hand side of the exponentiation expression; parentheses must be used to disambiguate the expression.`);
    }
}

{
    let tokens = [
        '-',
        '+',
        '~',
        '!',
        'typeof',
        'void',
        'delete',
    ];

    for (let token of tokens) {
        testSyntax(`
        function pow(a, b)
        {
            return (${token} a) ** b;
        }
        `);
    }
}

{
    let tokens = [
        '++',
        '--',
    ];

    for (let token of tokens) {
        testSyntax(`
        function pow(a, b)
        {
            return ${token} a ** b;
        }
        `);
    }
}

{
    let tokens = [
        '++',
        '--',
    ];

    for (let token of tokens) {
        testSyntax(`
        function pow(a, b)
        {
            return a ${token} ** b;
        }
        `);
    }
}