Default render() method on embeddables, and better testing.

This commit is contained in:
JesseBrault0709 2023-01-07 18:00:28 -06:00
parent fd09b720bb
commit 9d3f3f180b
8 changed files with 118 additions and 15 deletions

View File

@ -1,14 +1,16 @@
package com.jessebrault.ssg.part
import groovy.transform.NullCheck
import groovy.transform.TupleConstructor
@TupleConstructor(includeFields = true, defaults = false)
@NullCheck
class EmbeddablePart {
private final Part part
private final Map globals
String render(Map binding) {
String render(Map binding = [:]) {
part.type.renderer.render(this.part.text, binding, this.globals)
}

View File

@ -9,9 +9,10 @@ class GspPartRenderer implements PartRenderer {
@Override
String render(String partText, Map binding, Map globals) {
def bindingCopy = new LinkedHashMap(binding)
bindingCopy['globals'] = globals
engine.createTemplate(partText).make(bindingCopy)
engine.createTemplate(partText).make([
binding: binding,
globals: globals
])
}
}

View File

@ -13,6 +13,11 @@ class GspSpecialPageRenderer implements SpecialPageRenderer {
@Override
String render(String text, Collection<Text> texts, Collection<Part> parts, Map globals) {
Objects.requireNonNull(text)
Objects.requireNonNull(texts)
Objects.requireNonNull(parts)
Objects.requireNonNull(globals)
engine.createTemplate(text).make([
globals: globals,
parts: new EmbeddablePartsMap(parts, globals),

View File

@ -1,9 +1,11 @@
package com.jessebrault.ssg.text
import groovy.transform.Memoized
import groovy.transform.NullCheck
import groovy.transform.TupleConstructor
@TupleConstructor(includeFields = true, defaults = false)
@NullCheck
class EmbeddableText {
private final Text text

View File

@ -7,12 +7,12 @@ import com.jessebrault.ssg.specialpage.GspSpecialPageRenderer
import com.jessebrault.ssg.specialpage.SpecialPageFileSpecialPagesProvider
import com.jessebrault.ssg.specialpage.SpecialPageType
import com.jessebrault.ssg.template.GspTemplateRenderer
import com.jessebrault.ssg.template.TemplateType
import com.jessebrault.ssg.template.TemplateFileTemplatesProvider
import com.jessebrault.ssg.template.TemplateType
import com.jessebrault.ssg.text.MarkdownFrontMatterGetter
import com.jessebrault.ssg.text.MarkdownTextRenderer
import com.jessebrault.ssg.text.TextType
import com.jessebrault.ssg.text.TextFileTextsProvider
import com.jessebrault.ssg.text.TextType
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test

View File

@ -0,0 +1,29 @@
package com.jessebrault.ssg.part
import org.junit.jupiter.api.Test
import static org.junit.jupiter.api.Assertions.assertEquals
class GspPartRendererTests {
private final PartRenderer renderer = new GspPartRenderer()
@Test
void rendersWithNoBindingOrGlobals() {
def r = this.renderer.render('Hello, World!', [:], [:])
assertEquals('Hello, World!', r)
}
@Test
void rendersWithBinding() {
def r = this.renderer.render("<%= binding['greeting'] %>", [greeting: 'Hello, World!'], [:])
assertEquals('Hello, World!', r)
}
@Test
void rendersWithGlobals() {
def r = this.renderer.render("<%= globals['greeting'] %>", [:], [greeting: 'Hello, World!'])
assertEquals('Hello, World!', r)
}
}

View File

@ -0,0 +1,46 @@
package com.jessebrault.ssg.specialpage
import com.jessebrault.ssg.part.GspPartRenderer
import com.jessebrault.ssg.part.Part
import com.jessebrault.ssg.part.PartType
import com.jessebrault.ssg.text.MarkdownFrontMatterGetter
import com.jessebrault.ssg.text.MarkdownTextRenderer
import com.jessebrault.ssg.text.Text
import com.jessebrault.ssg.text.TextType
import org.junit.jupiter.api.Test
import static org.junit.jupiter.api.Assertions.assertEquals
class GspSpecialPageRendererTests {
private final SpecialPageRenderer renderer = new GspSpecialPageRenderer()
@Test
void rendersGlobal() {
def globals = [greeting: 'Hello, World!']
def r = this.renderer.render("<%= globals['greeting'] %>", [], [], globals)
assertEquals('Hello, World!', r)
}
@Test
void rendersPartWithNoBinding() {
def part = new Part('test', new PartType(['.gsp'], new GspPartRenderer()), 'Hello, World!')
def r = this.renderer.render("<%= parts['test'].render() %>", [], [part], [:])
assertEquals('Hello, World!', r)
}
@Test
void rendersPartWithBinding() {
def part = new Part('test', new PartType(['.gsp'], new GspPartRenderer()), "<%= binding['greeting'] %>")
def r = this.renderer.render("<%= parts['test'].render([greeting: 'Hello, World!'])", [], [part], [:])
assertEquals('Hello, World!', r)
}
@Test
void rendersText() {
def text = new Text('**Hello, World!**', 'test', new TextType(['.gsp'], new MarkdownTextRenderer(), new MarkdownFrontMatterGetter()))
def r = this.renderer.render("<%= texts.find { it.path == 'test' }.render() %>", [text], [], [:])
assertEquals('<p><strong>Hello, World!</strong></p>\n', r)
}
}

View File

@ -13,30 +13,48 @@ class GspTemplateRendererTests {
private final TemplateRenderer renderer = new GspTemplateRenderer()
@Test
void rendersPart() {
void rendersPartWithNoBinding() {
def template = new Template(
"<%= parts['greeting'].render([person: 'World']) %>",
"<%= parts['test'].render() %>",
null,
null
)
def part = new Part(
'greeting',
new PartType(['.gsp'], new GspPartRenderer()),
'Hello, $person!'
)
def part = new Part('test', new PartType(['.gsp'], new GspPartRenderer()), 'Hello, World!')
def r = this.renderer.render(template, new FrontMatter([:]), '', [part], [:])
assertEquals('Hello, World!', r)
}
@Test
void frontMatter() {
void rendersPartWithBinding() {
def template = new Template(
"<%= frontMatter['title'] %>",
"<%= parts['greeting'].render([person: 'World']) %>",
null,
null
)
def part = new Part('greeting', new PartType(['.gsp'], new GspPartRenderer()), 'Hello, $binding.person!')
def r = this.renderer.render(template, new FrontMatter([:]), '', [part], [:])
assertEquals('Hello, World!', r)
}
@Test
void rendersFrontMatter() {
def template = new Template("<%= frontMatter['title'] %>", null, null)
def r = this.renderer.render(template, new FrontMatter([title: ['Hello!']]), '', [], [:])
assertEquals('Hello!', r)
}
@Test
void rendersGlobal() {
def template = new Template("<%= globals['test'] %>", null, null)
def r = this.renderer.render(template, new FrontMatter([:]), '', [], [test: 'Hello, World!'])
assertEquals('Hello, World!', r)
}
@Test
void rendersText() {
def template = new Template('<%= text %>', null, null)
def r = this.renderer.render(template, new FrontMatter([:]), 'Hello, World!', [], [:])
assertEquals('Hello, World!', r)
}
}