Basic testing of IntrinsicHtml.
This commit is contained in:
parent
3a171b8736
commit
6ee903bde0
@ -3,7 +3,6 @@ package groowt.view.web.lib
|
|||||||
import groowt.view.View
|
import groowt.view.View
|
||||||
import groowt.view.component.context.ComponentContext
|
import groowt.view.component.context.ComponentContext
|
||||||
import groowt.view.component.factory.ComponentFactory
|
import groowt.view.component.factory.ComponentFactory
|
||||||
import groowt.view.web.runtime.WebViewComponentChildCollector
|
|
||||||
|
|
||||||
class Echo extends DelegatingWebViewComponent {
|
class Echo extends DelegatingWebViewComponent {
|
||||||
|
|
||||||
@ -12,19 +11,11 @@ class Echo extends DelegatingWebViewComponent {
|
|||||||
protected static class EchoFactory implements ComponentFactory<Echo> {
|
protected static class EchoFactory implements ComponentFactory<Echo> {
|
||||||
|
|
||||||
protected Echo doCreate() {
|
protected Echo doCreate() {
|
||||||
new Echo([:], [])
|
new Echo([:])
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Echo doCreate(Map attr) {
|
protected Echo doCreate(Map attr) {
|
||||||
new Echo(attr, [])
|
new Echo(attr)
|
||||||
}
|
|
||||||
|
|
||||||
protected Echo doCreate(WebViewComponentChildCollector childCollector) {
|
|
||||||
new Echo([:], childCollector.children)
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Echo doCreate(Map attr, WebViewComponentChildCollector childCollector) {
|
|
||||||
new Echo(attr, childCollector.children)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -41,13 +32,17 @@ class Echo extends DelegatingWebViewComponent {
|
|||||||
|
|
||||||
Map attr
|
Map attr
|
||||||
|
|
||||||
Echo(Map attr, List children) {
|
Echo(Map attr) {
|
||||||
this.attr = attr
|
this.attr = attr
|
||||||
this.children = children
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Object propertyMissing(String propertyName) {
|
@Override
|
||||||
attr[propertyName]
|
Object getProperty(String propertyName) {
|
||||||
|
try {
|
||||||
|
return super.getProperty(propertyName)
|
||||||
|
} catch (MissingPropertyException ignored) {
|
||||||
|
return attr[propertyName]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -5,7 +5,6 @@ import groowt.view.component.ComponentRenderException
|
|||||||
import groowt.view.component.context.ComponentContext
|
import groowt.view.component.context.ComponentContext
|
||||||
import groowt.view.component.context.ComponentScope.TypeAndFactory
|
import groowt.view.component.context.ComponentScope.TypeAndFactory
|
||||||
import groowt.view.component.factory.ComponentFactory
|
import groowt.view.component.factory.ComponentFactory
|
||||||
import groowt.view.web.WebViewComponentChild
|
|
||||||
import groowt.view.web.util.WithHtml
|
import groowt.view.web.util.WithHtml
|
||||||
|
|
||||||
class IntrinsicHtml extends DelegatingWebViewComponent implements WithHtml {
|
class IntrinsicHtml extends DelegatingWebViewComponent implements WithHtml {
|
||||||
@ -26,27 +25,13 @@ class IntrinsicHtml extends DelegatingWebViewComponent implements WithHtml {
|
|||||||
new IntrinsicHtml([:], typeName, typeName in voidElements)
|
new IntrinsicHtml([:], typeName, typeName in voidElements)
|
||||||
}
|
}
|
||||||
|
|
||||||
IntrinsicHtml doCreate(String typeName, boolean selfClose) {
|
|
||||||
new IntrinsicHtml([:], typeName, selfClose)
|
|
||||||
}
|
|
||||||
|
|
||||||
IntrinsicHtml doCreate(String typeName, Map<String, Object> attr) {
|
IntrinsicHtml doCreate(String typeName, Map<String, Object> attr) {
|
||||||
new IntrinsicHtml(attr, typeName, typeName in voidElements)
|
new IntrinsicHtml(attr, typeName, typeName in voidElements)
|
||||||
}
|
}
|
||||||
|
|
||||||
IntrinsicHtml doCreate(String typeName, Map<String, Object> attr, boolean selfClose) {
|
|
||||||
new IntrinsicHtml(attr, typeName, selfClose)
|
|
||||||
}
|
|
||||||
|
|
||||||
IntrinsicHtml doCreate(String typeName, Map<String, Object> attr, List<WebViewComponentChild> children) {
|
|
||||||
def intrinsicHtml = new IntrinsicHtml(attr, typeName, typeName in voidElements)
|
|
||||||
intrinsicHtml.children = children
|
|
||||||
intrinsicHtml
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
IntrinsicHtml create(String typeName, ComponentContext componentContext, Object... args) {
|
IntrinsicHtml create(String typeName, ComponentContext componentContext, Object... args) {
|
||||||
return this.doCreate(typeName, componentContext, *args)
|
return this.doCreate(typeName, *args)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -58,18 +43,18 @@ class IntrinsicHtml extends DelegatingWebViewComponent implements WithHtml {
|
|||||||
|
|
||||||
Map attr
|
Map attr
|
||||||
String name
|
String name
|
||||||
boolean selfClose
|
boolean isVoidElement
|
||||||
|
|
||||||
IntrinsicHtml(Map attr, String elementName, boolean selfClose) {
|
IntrinsicHtml(Map attr, String elementName, boolean isVoidElement) {
|
||||||
this.attr = attr
|
this.attr = attr
|
||||||
this.name = elementName
|
this.name = elementName
|
||||||
this.selfClose = selfClose
|
this.isVoidElement = isVoidElement
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected View getDelegate() {
|
protected View getDelegate() {
|
||||||
if (this.selfClose && this.hasChildren()) {
|
if (this.isVoidElement && this.hasChildren()) {
|
||||||
throw new ComponentRenderException('Cannot have selfClose set to true and have children.')
|
throw new ComponentRenderException('A void html element cannot have children.')
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
it << '<'
|
it << '<'
|
||||||
@ -78,9 +63,6 @@ class IntrinsicHtml extends DelegatingWebViewComponent implements WithHtml {
|
|||||||
it << ' '
|
it << ' '
|
||||||
this.formatAttr(it)
|
this.formatAttr(it)
|
||||||
}
|
}
|
||||||
if (this.selfClose) {
|
|
||||||
it << ' /'
|
|
||||||
}
|
|
||||||
it << '>'
|
it << '>'
|
||||||
if (this.hasChildren()) {
|
if (this.hasChildren()) {
|
||||||
this.children.each {
|
this.children.each {
|
||||||
@ -88,7 +70,7 @@ class IntrinsicHtml extends DelegatingWebViewComponent implements WithHtml {
|
|||||||
renderer.call(it.child)
|
renderer.call(it.child)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this.hasChildren() || !this.selfClose) {
|
if (!this.isVoidElement) {
|
||||||
it << '</'
|
it << '</'
|
||||||
it << this.name
|
it << this.name
|
||||||
it << '>'
|
it << '>'
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package groowt.view.web.runtime;
|
package groowt.view.web.runtime;
|
||||||
|
|
||||||
|
import groovy.lang.Closure;
|
||||||
import groowt.view.component.ViewComponent;
|
import groowt.view.component.ViewComponent;
|
||||||
import groowt.view.component.context.ComponentContext;
|
import groowt.view.component.context.ComponentContext;
|
||||||
import groowt.view.component.runtime.ComponentWriter;
|
import groowt.view.component.runtime.ComponentWriter;
|
||||||
@ -19,12 +20,18 @@ public class DefaultWebViewComponentRenderContext extends DefaultRenderContext
|
|||||||
if (args != null && args.length > 0) {
|
if (args != null && args.length > 0) {
|
||||||
final Object last = args[args.length - 1];
|
final Object last = args[args.length - 1];
|
||||||
if (last instanceof WebViewComponentChildCollectorClosure cl) {
|
if (last instanceof WebViewComponentChildCollectorClosure cl) {
|
||||||
|
final Object[] argsWithoutChildren = new Object[args.length - 1];
|
||||||
|
System.arraycopy(args, 0, argsWithoutChildren, 0, args.length - 1);
|
||||||
|
final WebViewComponent self = (WebViewComponent) super.create(resolved, argsWithoutChildren);
|
||||||
final var childCollector = new DefaultWebViewComponentChildCollector(
|
final var childCollector = new DefaultWebViewComponentChildCollector(
|
||||||
cl.getTemplate(),
|
cl.getTemplate(),
|
||||||
this.getWriter()
|
this.getWriter()
|
||||||
);
|
);
|
||||||
args[args.length - 1] = childCollector;
|
cl.setDelegate(self);
|
||||||
|
cl.setResolveStrategy(Closure.DELEGATE_FIRST);
|
||||||
cl.call(childCollector);
|
cl.call(childCollector);
|
||||||
|
self.setChildren(childCollector.getChildren());
|
||||||
|
return self;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return super.create(resolved, args);
|
return super.create(resolved, args);
|
||||||
|
@ -0,0 +1,29 @@
|
|||||||
|
package groowt.view.web.lib
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Disabled
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
|
class IntrinsicHtmlTests extends AbstractWebViewComponentTests {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void simplePElement() {
|
||||||
|
this.doTest('<p>Hello, World!</p>', '<p>Hello, World!</p>')
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void h1Element() {
|
||||||
|
this.doTest('<h1>Hello!</h1>', '<h1>Hello!</h1>')
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void attrTransferred() {
|
||||||
|
this.doTest('<h1 class="my-heading">Hello!</h1>', '<h1 class="my-heading">Hello!</h1>')
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Disabled('Until we figure out nested closure delegates')
|
||||||
|
void canUseEchoAttrProperty() {
|
||||||
|
this.doTest('<Echo greeting="Hello!"><p>$greeting</p></Echo>', '<p>Hello!</p>')
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user