diff --git a/package.json b/package.json index 0a5f34317..22e53048e 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "test:coverage": "jest --coverage --silent --runInBand", "test:dev": "jest --verbose --watch", "test:basic": "jest tests/markdown/basic.test.js --verbose", + "test:variables": "jest tests/markdown/variables.test.js --verbose", "test:mustache-syntax": "jest '.*(mustache-syntax).*' --verbose --noStackTrace", "test:mustache-syntax:inline": "jest '.*(mustache-syntax).*' -t '^Inline:.*' --verbose --noStackTrace", "test:mustache-syntax:block": "jest '.*(mustache-syntax).*' -t '^Block:.*' --verbose --noStackTrace", diff --git a/tests/markdown/variables.test.js b/tests/markdown/variables.test.js new file mode 100644 index 000000000..04d874d90 --- /dev/null +++ b/tests/markdown/variables.test.js @@ -0,0 +1,80 @@ +/* eslint-disable max-lines */ + +const dedent = require('dedent-tabs').default; +const Markdown = require('naturalcrit/markdown.js'); + +// Marked.js adds line returns after closing tags on some default tokens. +// This removes those line returns for comparison sake. +String.prototype.trimReturns = function(){ + return this.replace(/\r?\n|\r/g, '').trim(); +}; + +// Adding `.failing()` method to `describe` or `it` will make failing tests "pass" as long as they continue to fail. +// Remove the `.failing()` method once you have fixed the issue. + +describe('Block-level variables', ()=>{ + it('Handles variable assignment and recall with simple text', function() { + const source = dedent` + [var]: string + + $[var] + `; + const rendered = Markdown.render(source).trimReturns(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('

string

'); + }); + + it('Handles variable assignment and recall with multiline string', function() { + const source = dedent` + [var]: string + across multiple + lines + + $[var]`; + const rendered = Markdown.render(source).replace(/\s/g,' ').trimReturns(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('

string across multiple lines

'); + }); + + it('Handles variable assignment and recall with tables', function() { + const source = dedent` + [var]: + ##### Title + | H1 | H2 | + |:---|:--:| + | A | B | + | C | D | + + $[var]`; + const rendered = Markdown.render(source).replace(/\s/g,' ').trimReturns(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(dedent` +
Title
+ + + + + + +
H1H2
AB
CD
`.trimReturns()); + }); +}); + + +// TODO: add tests for ID with accordance to CSS spec: +// +// From https://drafts.csswg.org/selectors/#id-selectors: +// +// > An ID selector consists of a “number sign” (U+0023, #) immediately followed by the ID value, which must be a CSS identifier. +// +// From: https://www.w3.org/TR/CSS21/syndata.html#value-def-identifier: +// +// > In CSS, identifiers (including element names, classes, and IDs in selectors) can contain only the characters [a-zA-Z0-9] +// > and ISO 10646 characters U+00A0 and higher, plus the hyphen (-) and the underscore (_); +// > they cannot start with a digit, two hyphens, or a hyphen followed by a digit. +// > Identifiers can also contain escaped characters and any ISO 10646 character as a numeric code (see next item). +// > For instance, the identifier "B&W?" may be written as "B\&W\?" or "B\26 W\3F". +// > Note that Unicode is code-by-code equivalent to ISO 10646 (see [UNICODE] and [ISO10646]). + +// TODO: add tests for class with accordance to CSS spec: +// +// From: https://drafts.csswg.org/selectors/#class-html: +// +// > The class selector is given as a full stop (. U+002E) immediately followed by an identifier.