summaryrefslogtreecommitdiff
path: root/specs/~inheritance.yml
diff options
context:
space:
mode:
Diffstat (limited to 'specs/~inheritance.yml')
-rw-r--r--specs/~inheritance.yml194
1 files changed, 194 insertions, 0 deletions
diff --git a/specs/~inheritance.yml b/specs/~inheritance.yml
new file mode 100644
index 0000000..8881ee5
--- /dev/null
+++ b/specs/~inheritance.yml
@@ -0,0 +1,194 @@
+overview: |
+ Parent tags are used to expand an external template into the current template,
+ with optional parameters delimited by block tags.
+
+ These tags' content MUST be a non-whitespace character sequence NOT containing
+ the current closing delimiter; each Parent tag MUST be followed by an End
+ Section tag with the same content within the matching parent tag.
+
+ Block tags are used inside of parent tags to assign data onto the context
+ stack prior to rendering the parent template. Outside of parent tags, block
+ tags are used to indicate where value set in the parent tag should be placed.
+ If no value is set then the content in between the block tags, if any, is
+ rendered.
+tests:
+ - name: Default
+ desc: Default content should be rendered if the block isn't overridden
+ data: { }
+ template: |
+ {{$title}}Default title{{/title}}
+ expected: |
+ Default title
+
+ - name: Variable
+ desc: Default content renders variables
+ data: { bar: 'baz' }
+ template: |
+ {{$foo}}default {{bar}} content{{/foo}}
+ expected: |
+ default baz content
+
+ - name: Triple Mustache
+ desc: Default content renders triple mustache variables
+ data: { bar: '<baz>' }
+ template: |
+ {{$foo}}default {{{bar}}} content{{/foo}}
+ expected: |
+ default <baz> content
+
+ - name: Sections
+ desc: Default content renders sections
+ data: { bar: {baz: 'qux'} }
+ template: |
+ {{$foo}}default {{#bar}}{{baz}}{{/bar}} content{{/foo}}
+ expected: |
+ default qux content
+
+ - name: Negative Sections
+ desc: Default content renders negative sections
+ data: { baz: 'three' }
+ template: |
+ {{$foo}}default {{^bar}}{{baz}}{{/bar}} content{{/foo}}
+ expected: |
+ default three content
+
+ - name: Mustache Injection
+ desc: Mustache injection in default content
+ data: {bar: {baz: '{{qux}}'} }
+ template: |
+ {{$foo}}default {{#bar}}{{baz}}{{/bar}} content{{/foo}}
+ expected: |
+ default {{qux}} content
+
+ - name: Inherit
+ desc: Default content rendered inside included templates
+ data: { }
+ template: |
+ {{<include}}{{/include}}
+ partials:
+ include: "{{$foo}}default content{{/foo}}"
+ expected: "default content"
+
+ - name: Overridden content
+ desc: Overridden content
+ data: { }
+ template: "{{<super}}{{$title}}sub template title{{/title}}{{/super}}"
+ partials:
+ super: "...{{$title}}Default title{{/title}}..."
+ expected: "...sub template title..."
+
+ - name: Data does not override block
+ desc: Provided data does not override data passed into parent
+ data: { var: 'var in data' }
+ template: "{{<include}}{{$var}}var in template{{/var}}{{/include}}"
+ partials:
+ include: "{{$var}}var in include{{/var}}"
+ expected: "var in template"
+
+ - name: Data does not override block default
+ desc: Provided data does not override default value of block
+ data: { var: 'var in data' }
+ template: "{{<include}}{{/include}}"
+ partials:
+ include: "{{$var}}var in include{{/var}}"
+ expected: "var in include"
+
+ - name: Overridden partial
+ desc: Overridden partial
+ data: { }
+ template: "test {{<partial}}{{$stuff}}override{{/stuff}}{{/partial}}"
+ partials:
+ partial: "{{$stuff}}...{{/stuff}}"
+ expected: "test override"
+
+ - name: Two overridden partials
+ desc: Two overridden partials with different content
+ data: { }
+ template: |
+ test {{<partial}}{{$stuff}}override1{{/stuff}}{{/partial}} {{<partial}}{{$stuff}}override2{{/stuff}}{{/partial}}
+ partials:
+ partial: "|{{$stuff}}...{{/stuff}}{{$default}} default{{/default}}|"
+ expected: |
+ test |override1 default| |override2 default|
+
+ - name: Override partial with newlines
+ desc: Override partial with newlines
+ data: { }
+ template: "{{<partial}}{{$ballmer}}\npeaked\n\n:(\n{{/ballmer}}{{/partial}}"
+ partials:
+ partial: "{{$ballmer}}peaking{{/ballmer}}"
+ expected: "peaked\n\n:(\n"
+
+ - name: Inherit indentation
+ desc: Inherit indentation when overriding a partial
+ data: { }
+ template: "{{<partial}}{{$nineties}}hammer time{{/nineties}}{{/partial}}"
+ partials:
+ partial: |
+ stop:
+ {{$nineties}}collaborate and listen{{/nineties}}
+ expected: |
+ stop:
+ hammer time
+
+ - name: Only one override
+ desc: Override one substitution but not the other
+ data: { }
+ template: "{{<partial}}{{$stuff2}}override two{{/stuff2}}{{/partial}}"
+ partials:
+ partial: "{{$stuff}}new default one{{/stuff}}, {{$stuff2}}new default two{{/stuff2}}"
+ expected: "new default one, override two"
+
+ - name: Super template
+ desc: Super templates behave identically to partials when called with no parameters
+ data: { }
+ template: "{{>include}}|{{<include}}{{/include}}"
+ partials:
+ include: "{{$foo}}default content{{/foo}}"
+ expected: "default content|default content"
+
+ - name: Recursion
+ desc: Recursion in inherited templates
+ data: {}
+ template: "{{<include}}{{$foo}}override{{/foo}}{{/include}}"
+ partials:
+ include: "{{$foo}}default content{{/foo}} {{$bar}}{{<include2}}{{/include2}}{{/bar}}"
+ include2: "{{$foo}}include2 default content{{/foo}} {{<include}}{{$bar}}don't recurse{{/bar}}{{/include}}"
+ expected: "override override override don't recurse"
+
+ - name: Multi-level inheritance
+ desc: Top-level substitutions take precedence in multi-level inheritance
+ data: { }
+ template: "{{<parent}}{{$a}}c{{/a}}{{/parent}}"
+ partials:
+ parent: "{{<older}}{{$a}}p{{/a}}{{/older}}"
+ older: "{{<grandParent}}{{$a}}o{{/a}}{{/grandParent}}"
+ grandParent: "{{$a}}g{{/a}}"
+ expected: c
+
+ - name: Multi-level inheritance, no sub child
+ desc: Top-level substitutions take precedence in multi-level inheritance
+ data: { }
+ template: "{{<parent}}{{/parent}}"
+ partials:
+ parent: "{{<older}}{{$a}}p{{/a}}{{/older}}"
+ older: "{{<grandParent}}{{$a}}o{{/a}}{{/grandParent}}"
+ grandParent: "{{$a}}g{{/a}}"
+ expected: p
+
+ - name: Text inside super
+ desc: Ignores text inside super templates, but does parse $ tags
+ data: { }
+ template: "{{<include}} asdfasd {{$foo}}hmm{{/foo}} asdfasdfasdf {{/include}}"
+ partials:
+ include: "{{$foo}}default content{{/foo}}"
+ expected:
+ hmm
+
+ - name: Text inside super
+ desc: Allows text inside a super tag, but ignores it
+ data: {}
+ template: "{{<include}} asdfasd asdfasdfasdf {{/include}}"
+ partials:
+ include: "{{$foo}}default content{{/foo}}"
+ expected: default content