eggtended-js
Version:
A extended version of the Egg programming language from the Eloquent Javascript book.
315 lines (277 loc) • 17.9 kB
HTML
<html>
<head>
<meta charset="utf-8">
<base data-ice="baseUrl" href="../../">
<title data-ice="title">test/tokenRegex-test.js | eggtended-js</title>
<link type="text/css" rel="stylesheet" href="css/style.css">
<link type="text/css" rel="stylesheet" href="css/prettify-tomorrow.css">
<script src="script/prettify/prettify.js"></script>
<script src="script/manual.js"></script>
<meta name="description" content="An extended version of the Egg programming language"><meta property="og:type" content="website"><meta property="og:url" content="http://my-library.org"><meta property="og:site_name" content="eggtended-js"><meta property="og:title" content="eggtended-js"><meta property="og:image" content="https://i.imgur.com/9N4qe98.png"><meta property="og:description" content="An extended version of the Egg programming language"><meta property="og:author" content="https://github.com/Dibad"><meta property="twitter:card" content="summary"><meta property="twitter:title" content="eggtended-js"><meta property="twitter:description" content="An extended version of the Egg programming language"><meta property="twitter:image" content="https://i.imgur.com/9N4qe98.png"></head>
<body class="layout-container" data-ice="rootContainer">
<header>
<a href="./">Home</a>
<a href="identifiers.html">Reference</a>
<a href="source.html">Source</a>
<a href="test.html" data-ice="testLink">Test</a>
<div class="search-box">
<span>
<img src="./image/search.png">
<span class="search-input-edge"></span><input class="search-input"><span class="search-input-edge"></span>
</span>
<ul class="search-result"></ul>
</div>
<a style="position:relative; top:3px;" href="https://github.com/Dibad/eggtended-js"><img width="20px" src="./image/github.png"></a></header>
<nav class="navigation" data-ice="nav"><div>
<ul>
<li data-ice="doc"><span data-ice="kind" class="kind-function">F</span><span data-ice="name"><span><a href="function/index.html#static-function-checkIterable">checkIterable</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-function">F</span><span data-ice="name"><span><a href="function/index.html#static-function-chunk">chunk</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-function">F</span><span data-ice="name"><span><a href="function/index.html#static-function-getValidIndex">getValidIndex</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-function">F</span><span data-ice="name"><span><a href="function/index.html#static-function-ins">ins</a></span></span></li>
<li data-ice="doc"><a data-ice="dirPath" class="nav-dir-path" href="identifiers.html#interp">interp</a><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/lib/interp/ast.js~Apply.html">Apply</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/lib/interp/ast.js~Regex.html">Regex</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/lib/interp/ast.js~Value.html">Value</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/lib/interp/ast.js~Word.html">Word</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/lib/interp/eggvm.js~Eggvm.html">Eggvm</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/lib/interp/symboltable.js~SymbolTable.html">SymbolTable</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-SpecialForms">SpecialForms</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-TopEnv">TopEnv</a></span></span></li>
<li data-ice="doc"><a data-ice="dirPath" class="nav-dir-path" href="identifiers.html#parser">parser</a><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/lib/parser/lexer.js~Lexer.html">Lexer</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/lib/parser/parse.js~Parser.html">Parser</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/lib/parser/tokenRegex.js~TokenRegex.html">TokenRegex</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-function">F</span><span data-ice="name"><span><a href="function/index.html#static-function-json2AST">json2AST</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-COMMA">COMMA</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-LP">LP</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-NEWLINE">NEWLINE</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-NUMBER">NUMBER</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-REGEX">REGEX</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-RP">RP</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-STRING">STRING</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-WHITES">WHITES</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-WORD">WORD</a></span></span></li>
<li data-ice="doc"><a data-ice="dirPath" class="nav-dir-path" href="identifiers.html#repl">repl</a><span data-ice="kind" class="kind-function">F</span><span data-ice="name"><span><a href="function/index.html#static-function-eggCompleter">eggCompleter</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-function">F</span><span data-ice="name"><span><a href="function/index.html#static-function-getPromptLine">getPromptLine</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-function">F</span><span data-ice="name"><span><a href="function/index.html#static-function-repl">repl</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-BLUE">BLUE</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-DEFAULT">DEFAULT</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-GREEN">GREEN</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-RED">RED</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-YELLOW">YELLOW</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-eggClear">eggClear</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-eggExit">eggExit</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-eggHelp">eggHelp</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-eggInfo">eggInfo</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-eggRun">eggRun</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-eggVersion">eggVersion</a></span></span></li>
</ul>
</div>
</nav>
<div class="content" data-ice="content"><h1 data-ice="title">test/tokenRegex-test.js</h1>
<pre class="source-code line-number raw-source-code"><code class="prettyprint linenums" data-ice="content">const tokenRegex = require("../lib/parser/tokenRegex.js");
const should = require("should");
describe("Regex for LP token", () => {
it("should recognize ( as valid a token", () => {
const expected = { type: "LP", value: "(", start: 1, end: 1 };
tokenRegex.LP.reset()
.exec("(")
.should.be.eql(expected);
});
it("should treat { as a synonym for (", () => {
const expected = { type: "LP", value: "{", start: 1, end: 1 };
tokenRegex.LP.reset()
.exec("{")
.should.be.eql(expected);
});
it("should treat [ as a synonym for (", () => {
const expected = { type: "LP", value: "[", start: 1, end: 1 };
tokenRegex.LP.reset()
.exec("[")
.should.be.eql(expected);
});
});
describe("Regex for RP token", () => {
it("should recognize ) as valid a token", () => {
const expected = { type: "RP", value: ")", start: 1, end: 1 };
tokenRegex.RP.reset()
.exec(")")
.should.be.eql(expected);
});
it("should treat } as a synonym for )", () => {
const expected = { type: "RP", value: "}", start: 1, end: 1 };
tokenRegex.RP.reset()
.exec("}")
.should.be.eql(expected);
});
it("should treat ] as a synonym for )", () => {
const expected = { type: "RP", value: "]", start: 1, end: 1 };
tokenRegex.RP.reset()
.exec("]")
.should.be.eql(expected);
});
});
describe("Regex for COMMA token", () => {
it("should recognize , as valid a token", () => {
const expected = { type: "COMMA", value: ",", start: 1, end: 1 };
tokenRegex.COMMA.reset()
.exec(",")
.should.be.eql(expected);
});
it("should recognize the : as an alias for ,", () => {
const expected = { type: "COMMA", value: ":", start: 1, end: 1 };
tokenRegex.COMMA.reset()
.exec(":")
.should.be.eql(expected);
// Only when is not followed by a =
should.not.exists(tokenRegex.COMMA.reset().exec(":="));
});
});
describe("Regex for WHITES token", () => {
it("should recognize any quantity of space", () => {
const expected = { type: "WHITE", value: " ", start: 1, end: 2 };
tokenRegex.WHITES.reset()
.exec(" ")
.should.be.eql(expected);
});
it("should recognize as white even strings with newlines", () => {
const expected = { type: "WHITE", value: " \n ", start: 1, end: 5 };
tokenRegex.WHITES.reset()
.exec(" \n ")
.should.be.eql(expected);
});
it("should recognize as white one-line comments with # or ;", () => {
let expected = { type: "WHITE", value: "# commen t", start: 1, end: 10 };
tokenRegex.WHITES.reset()
.exec("# commen t")
.should.be.eql(expected);
expected = { type: "WHITE", value: "; commen t", start: 1, end: 10 };
tokenRegex.WHITES.reset()
.exec("; commen t")
.should.be.eql(expected);
});
it("should recognize as white multiline commments with /* */", () => {
const expected = {
type: "WHITE",
value: "/* this is \n a multiline\n comment */",
start: 1,
end: 36
};
tokenRegex.WHITES.reset()
.exec("/* this is \n a multiline\n comment */")
.should.be.eql(expected);
});
});
describe("Regex for STRING token", () => {
it('should recognize anything between " " as valid a token', () => {
const expected = {
type: "STRING",
value: "hello world",
start: 3,
end: 13
};
tokenRegex.STRING.reset()
.exec('"hello world"')
.should.be.eql(expected);
});
it('shouldn\'t recognize strings without " ". Those are words', () => {
should.not.exists(tokenRegex.STRING.reset().exec("hello world"));
});
});
describe("Regex for WORD token", () => {
it("shouldn't include some special characters on the identifier", () => {
const expected = { type: "WORD", value: "fun", start: 1, end: 3 };
tokenRegex.WORD.reset()
.exec("fun()")
.should.be.eql(expected);
tokenRegex.WORD.reset()
.exec("fun[]")
.should.be.eql(expected);
tokenRegex.WORD.reset()
.exec("fun{}")
.should.be.eql(expected);
tokenRegex.WORD.reset()
.exec("fun, ")
.should.be.eql(expected);
tokenRegex.WORD.reset()
.exec("fun:, ")
.should.be.eql(expected);
});
it("should detect [] as a whole WORD, instead of LP, RP", () => {
const expected = { type: "WORD", value: "[]", start: 1, end: 2 };
tokenRegex.WORD.reset()
.exec("[]")
.should.be.eql(expected);
});
it("should detect := as a whole WORD; instead of COMMA, WORD", () => {
const expected = { type: "WORD", value: ":=", start: 1, end: 2 };
tokenRegex.WORD.reset()
.exec(":=")
.should.be.eql(expected);
});
});
describe("Regex for NUMBER token", () => {
it("should match integers, with and without sign", () => {
// Normal int
let expected = { type: "NUMBER", value: "323", start: 1, end: 3 };
tokenRegex.NUMBER.reset()
.exec("323")
.should.be.eql(expected);
// With positive sign
expected = { type: "NUMBER", value: "+2", start: 1, end: 2 };
tokenRegex.NUMBER.reset()
.exec("+2")
.should.be.eql(expected);
// With negative sign
expected = { type: "NUMBER", value: "-123", start: 1, end: 4 };
tokenRegex.NUMBER.reset()
.exec("-123")
.should.be.eql(expected);
// Signs can't go alone!!
should.not.exists(tokenRegex.NUMBER.reset().exec("-"));
should.not.exists(tokenRegex.NUMBER.reset().exec("+"));
});
it("should match for floats, floating point and exponential notation", () => {
// Normal float
let expected = { type: "NUMBER", value: "12.34", start: 1, end: 5 };
tokenRegex.NUMBER.reset()
.exec("12.34")
.should.be.eql(expected);
// Float starting with .
expected = { type: "NUMBER", value: ".35", start: 1, end: 3 };
tokenRegex.NUMBER.reset()
.exec(".35")
.should.be.eql(expected);
// Float in exponential notation
expected = { type: "NUMBER", value: "2e5", start: 1, end: 3 };
tokenRegex.NUMBER.reset()
.exec("2e5")
.should.be.eql(expected);
// Float with decimals and exponential notation
expected = { type: "NUMBER", value: "45.8e5", start: 1, end: 6 };
tokenRegex.NUMBER.reset()
.exec("45.8e5")
.should.be.eql(expected);
// Float with exponential notation with sign and E
expected = { type: "NUMBER", value: "8E-34", start: 1, end: 5 };
tokenRegex.NUMBER.reset()
.exec("8E-34")
.should.be.eql(expected);
// Shouldn't match exponential alone or without exponential num
should.not.exists(tokenRegex.NUMBER.reset().exec("e45"));
should.not.exists(tokenRegex.NUMBER.reset().exec("E"));
});
});
</code></pre>
</div>
<footer class="footer">
Generated by <a href="https://esdoc.org">ESDoc<span data-ice="esdocVersion">(1.1.0)</span><img src="./image/esdoc-logo-mini-black.png"></a>
</footer>
<script src="script/search_index.js"></script>
<script src="script/search.js"></script>
<script src="script/pretty-print.js"></script>
<script src="script/inherited-summary.js"></script>
<script src="script/test-summary.js"></script>
<script src="script/inner-link.js"></script>
<script src="script/patch-for-local.js"></script>
</body>
</html>