Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
| import { describe, it, expect } from "vitest"; | |
| import { Environment, Interpreter } from "../src/runtime"; | |
| import { tokenize } from "../src/lexer"; | |
| import { parse } from "../src/parser"; | |
| describe("Test interpreter options", () => { | |
| // https://jinja.palletsprojects.com/en/3.0.x/templates/#whitespace-control | |
| it("should handle whitespace control", () => { | |
| const EXAMPLE_IF_TEMPLATE = `<div>\n {% if True %}\n yay\n {% endif %}\n</div>`; | |
| const EXAMPLE_FOR_TEMPLATE = `{% for item in seq %}\n {{ item }}\n{% endfor %}`; | |
| const EXAMPLE_FOR_TEMPLATE_2 = `{% for item in seq -%}\n {{ item }}\n{% endfor %}`; | |
| const EXAMPLE_FOR_TEMPLATE_3 = `{% for item in seq %}\n {{ item }}\n{%- endfor %}`; | |
| const EXAMPLE_FOR_TEMPLATE_4 = `{% for item in seq -%}\n {{ item }}\n{%- endfor %}`; | |
| const EXAMPLE_COMMENT_TEMPLATE = ` {# comment #}\n {# {% if true %} {% endif %} #}\n`; | |
| const seq = [1, 2, 3, 4, 5, 6, 7, 8, 9]; | |
| const TESTS = [ | |
| // If tests | |
| { | |
| template: EXAMPLE_IF_TEMPLATE, | |
| data: {}, | |
| options: {}, | |
| target: `<div>\n \n yay\n \n</div>`, | |
| }, | |
| { | |
| template: EXAMPLE_IF_TEMPLATE, | |
| data: {}, | |
| options: { | |
| lstrip_blocks: true, | |
| }, | |
| target: `<div>\n\n yay\n\n</div>`, | |
| }, | |
| { | |
| template: EXAMPLE_IF_TEMPLATE, | |
| data: {}, | |
| options: { | |
| trim_blocks: true, | |
| }, | |
| target: `<div>\n yay\n </div>`, | |
| }, | |
| { | |
| template: EXAMPLE_IF_TEMPLATE, | |
| data: {}, | |
| options: { | |
| lstrip_blocks: true, | |
| trim_blocks: true, | |
| }, | |
| target: `<div>\n yay\n</div>`, | |
| }, | |
| // For tests | |
| { | |
| template: EXAMPLE_FOR_TEMPLATE, | |
| data: { seq }, | |
| options: {}, | |
| target: `\n 1\n\n 2\n\n 3\n\n 4\n\n 5\n\n 6\n\n 7\n\n 8\n\n 9\n`, | |
| }, | |
| { | |
| template: EXAMPLE_FOR_TEMPLATE, | |
| data: { seq }, | |
| options: { lstrip_blocks: true }, | |
| target: `\n 1\n\n 2\n\n 3\n\n 4\n\n 5\n\n 6\n\n 7\n\n 8\n\n 9\n`, | |
| }, | |
| { | |
| template: EXAMPLE_FOR_TEMPLATE, | |
| data: { seq }, | |
| options: { trim_blocks: true }, | |
| target: ` 1\n 2\n 3\n 4\n 5\n 6\n 7\n 8\n 9\n`, | |
| }, | |
| { | |
| template: EXAMPLE_FOR_TEMPLATE, | |
| data: { seq }, | |
| options: { lstrip_blocks: true, trim_blocks: true }, | |
| target: ` 1\n 2\n 3\n 4\n 5\n 6\n 7\n 8\n 9\n`, | |
| }, | |
| { | |
| template: EXAMPLE_FOR_TEMPLATE_2, | |
| data: { seq }, | |
| options: {}, | |
| target: `1\n2\n3\n4\n5\n6\n7\n8\n9\n`, | |
| }, | |
| { | |
| template: EXAMPLE_FOR_TEMPLATE_3, | |
| data: { seq }, | |
| options: {}, | |
| target: `\n 1\n 2\n 3\n 4\n 5\n 6\n 7\n 8\n 9`, | |
| }, | |
| { | |
| template: EXAMPLE_FOR_TEMPLATE_3, | |
| data: { seq }, | |
| options: { trim_blocks: true }, | |
| target: ` 1 2 3 4 5 6 7 8 9`, | |
| }, | |
| { | |
| template: EXAMPLE_FOR_TEMPLATE_4, | |
| data: { seq }, | |
| options: {}, | |
| target: `123456789`, | |
| }, | |
| // Comment tests | |
| { | |
| template: EXAMPLE_COMMENT_TEMPLATE, | |
| data: {}, | |
| options: {}, | |
| target: ` \n `, | |
| }, | |
| { | |
| template: EXAMPLE_COMMENT_TEMPLATE, | |
| data: {}, | |
| options: { lstrip_blocks: true }, | |
| target: `\n`, | |
| }, | |
| { | |
| template: EXAMPLE_COMMENT_TEMPLATE, | |
| data: {}, | |
| options: { trim_blocks: true }, | |
| target: ` `, | |
| }, | |
| { | |
| template: EXAMPLE_COMMENT_TEMPLATE, | |
| data: {}, | |
| options: { lstrip_blocks: true, trim_blocks: true }, | |
| target: ``, | |
| }, | |
| ]; | |
| for (const test of TESTS) { | |
| const env = new Environment(); | |
| env.set("True", true); | |
| for (const [key, value] of Object.entries(test.data)) { | |
| env.set(key, value); | |
| } | |
| const tokens = tokenize(test.template, test.options); | |
| const parsed = parse(tokens); | |
| const interpreter = new Interpreter(env); | |
| const result = interpreter.run(parsed); | |
| expect(result.value).toEqual(test.target); | |
| } | |
| }); | |
| }); | |