swift-pattern-compiler
Version:
A compiler which transforms SWIFT patterns to an object representation with additional information's.
274 lines (270 loc) • 7.57 kB
text/typescript
import * as test from "tape";
import { ETokenType } from "../src/interfaces";
import { tokenizer } from "../src/tokenizer";
import { ITest } from "./testInterfaces";
test("tokenizer module", t => {
t.plan(1);
t.ok(typeof tokenizer === "function", "expect tokenizer to be a function");
});
test("tokenizer call", t => {
const tests: ITest[] = [
{
msg: "should handle 35a",
actual: tokenizer("35a"),
expected: [
{
type: ETokenType.num,
value: "35",
},
{
type: ETokenType.char,
value: "a",
},
],
},
{
msg: "should handle 4a",
actual: tokenizer("4a"),
expected: [
{
type: ETokenType.num,
value: "4",
},
{
type: ETokenType.char,
value: "a",
},
],
},
{
msg: "should handle 4!c",
actual: tokenizer("4!c"),
expected: [
{
type: ETokenType.num,
value: "4",
},
{
type: ETokenType.quant,
value: "!",
},
{
type: ETokenType.char,
value: "c",
},
],
},
{
msg: "tokenize pattern /4!c",
actual: tokenizer("/4!c"),
expected: [
{
type: ETokenType.sign,
value: "/",
},
{
type: ETokenType.num,
value: "4",
},
{
type: ETokenType.quant,
value: "!",
},
{
type: ETokenType.char,
value: "c",
},
],
},
{
msg: "tokenize pattern :4!c",
actual: tokenizer(":4!c"),
expected: [
{
type: ETokenType.sign,
value: ":",
},
{
type: ETokenType.num,
value: "4",
},
{
type: ETokenType.quant,
value: "!",
},
{
type: ETokenType.char,
value: "c",
},
],
},
{
msg: "tokenize pattern [3c]",
actual: tokenizer("[3c]"),
expected: [
{
type: ETokenType.bracket,
value: "[",
},
{
type: ETokenType.num,
value: "3",
},
{
type: ETokenType.char,
value: "c",
},
{
type: ETokenType.bracket,
value: "]",
},
],
},
{
msg: "tokenize pattern 1d\n5a",
actual: tokenizer("1d\n5a"),
expected: [
{
type: ETokenType.num,
value: "1",
},
{
type: ETokenType.char,
value: "d",
},
{
type: ETokenType.newline,
value: "\n",
},
{
type: ETokenType.num,
value: "5",
},
{
type: ETokenType.char,
value: "a",
},
],
},
{
msg: "tokenize pattern 1-5d",
actual: tokenizer("1-5d"),
expected: [
{
type: ETokenType.num,
value: "1",
},
{
type: ETokenType.quant,
value: "-",
},
{
type: ETokenType.num,
value: "5",
},
{
type: ETokenType.char,
value: "d",
},
],
},
{
msg: "tokenize pattern 5*35x",
actual: tokenizer("5*35x"),
expected: [
{
type: ETokenType.num,
value: "5",
},
{
type: ETokenType.multilineQuant,
value: "*",
},
{
type: ETokenType.num,
value: "35",
},
{
type: ETokenType.char,
value: "x",
},
],
},
{
msg: "tokenize pattern ISIN1!e",
actual: tokenizer("ISIN1!e"),
expected: [
{
type: ETokenType.const,
value: "ISIN",
},
{
type: ETokenType.num,
value: "1",
},
{
type: ETokenType.quant,
value: "!",
},
{
type: ETokenType.char,
value: "e",
},
],
},
{
msg: "tokenize pattern 4*(1!n)",
actual: tokenizer("4*(1!n)"),
expected: [
{
type: ETokenType.num,
value: "4",
},
{
type: ETokenType.multilineQuant,
value: "*",
},
{
type: ETokenType.paren,
value: "(",
},
{
type: ETokenType.num,
value: "1",
},
{
type: ETokenType.quant,
value: "!",
},
{
type: ETokenType.char,
value: "n",
},
{
type: ETokenType.paren,
value: ")",
},
],
},
{
msg: "should throw when # is supplied",
method: "throws",
actual: () => tokenizer("#"),
expected: /Unmatched character "#"/,
},
{
msg: "should return empty array for empty string",
actual: tokenizer(""),
expected: [],
},
];
t.plan(tests.length);
tests.forEach(({
actual,
expected,
msg = "",
method = "deepEqual",
}) => {
t[method](actual, expected, msg);
});
});