package org.ovirt.engine.ui.uicommonweb.builders; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertThat; import org.junit.Before; import org.junit.Test; import org.ovirt.engine.ui.uicommonweb.builders.BuilderExecutor.BuilderExecutionFinished; @SuppressWarnings("unchecked") public class BuilderExecutorTest { private static final String be2 = "be2"; //$NON-NLS-1$ private static final String be1 = "be1"; //$NON-NLS-1$ private static final String fe2 = "fe2"; //$NON-NLS-1$ private static final String fe1 = "fe1"; //$NON-NLS-1$ private TestingFrontendModel frontendModel; private TestingBackendModel backendModel; @Before public void setup() { frontendModel = new TestingFrontendModel(fe1, fe2); backendModel = new TestingBackendModel(be1, be2); } @Test public void bothEmptyBuilderListShouldDoNothing() { new BuilderExecutor<>(new FrontendAssert(fe1, fe2)).build(frontendModel, backendModel); new BuilderExecutor<>(new BackendAssert(be1, be2)).build(frontendModel, backendModel); } @Test public void frontendToBackendOneBuilder() { new BuilderExecutor<>(new BackendAssert(fe1, be2), new Property1Builder()).build(frontendModel, backendModel); } @Test public void frontendToBackendTwoBuilders() { new BuilderExecutor<>(new BackendAssert(fe1, fe2), new Property1Builder(), new Property2Builder()) .build(frontendModel, backendModel); } @Test public void oneCompositeOneInnerFromBackendToFrontend() { BuilderExecutor<TestingFrontendModel, TestingBackendModel> builderExecutor = new BuilderExecutor<>(new BackendAssert(fe1, be2), new CompositeBuilder<>(new Property1Builder())); builderExecutor.build(frontendModel, backendModel); } @Test public void oneCompositeTwoInnersFromBackendToFrontend() { BuilderExecutor<TestingFrontendModel, TestingBackendModel> builderExecutor = new BuilderExecutor<>(new BackendAssert(fe1, fe2), new CompositeBuilder<>(new Property1Builder(), new Property2Builder())); builderExecutor.build(frontendModel, backendModel); } @Test public void twoCompositesOneInnerFromBackendToFrontend() { CompositeBuilder<TestingFrontendModel, TestingBackendModel> composite1 = new CompositeBuilder<>(new Property1Builder()); CompositeBuilder<TestingFrontendModel, TestingBackendModel> composite2 = new CompositeBuilder<>(new Property2Builder()); BuilderExecutor<TestingFrontendModel, TestingBackendModel> builderExecutor = new BuilderExecutor<>(new BackendAssert(fe1, fe2), composite1, composite2); builderExecutor.build(frontendModel, backendModel); } @Test public void compositeInCompositeFromBackendToFrontend() { CompositeBuilder<TestingFrontendModel, TestingBackendModel> composite1 = new CompositeBuilder<>(new Property1Builder()); CompositeBuilder<TestingFrontendModel, TestingBackendModel> composite2 = new CompositeBuilder<>(composite1); new BuilderExecutor<>(new BackendAssert(fe1, be2), composite2).build(frontendModel, backendModel); } @Test public void compositeInCompositeInsideCompositeFromBackendToFrontend() { CompositeBuilder<TestingFrontendModel, TestingBackendModel> composite0 = new CompositeBuilder<>(new Property1Builder(), new Property2Builder()); CompositeBuilder<TestingFrontendModel, TestingBackendModel> composite1 = new CompositeBuilder<>(composite0); CompositeBuilder<TestingFrontendModel, TestingBackendModel> composite2 = new CompositeBuilder<>(composite1); new BuilderExecutor<>(new BackendAssert(fe1, fe2), composite2).build(frontendModel, backendModel); } @Test public void compositeAndThanNormalFromBackendToFrontend() { CompositeBuilder<TestingFrontendModel, TestingBackendModel> composite = new CompositeBuilder<>(new Property1Builder()); new BuilderExecutor<>(new BackendAssert(fe1, fe2), composite, new Property2Builder()).build(frontendModel, backendModel); } } class Property1Builder extends BaseSyncBuilder<TestingFrontendModel, TestingBackendModel> { @Override protected void build(TestingFrontendModel frontend, TestingBackendModel backend) { backend.setProperty1(frontend.getProperty1()); } } class FrontendAssert implements BuilderExecutionFinished<TestingFrontendModel, TestingBackendModel> { private String prop1; private String prop2; public FrontendAssert(String prop1, String prop2) { super(); this.prop1 = prop1; this.prop2 = prop2; } @Override public void finished(TestingFrontendModel frontendModel, TestingBackendModel backendModel) { assertThat(frontendModel, is(equalTo(new TestingFrontendModel(prop1, prop2)))); } } class BackendAssert implements BuilderExecutionFinished<TestingFrontendModel, TestingBackendModel> { private String prop1; private String prop2; public BackendAssert(String prop1, String prop2) { super(); this.prop1 = prop1; this.prop2 = prop2; } @Override public void finished(TestingFrontendModel frontendModel, TestingBackendModel backendModel) { assertThat(backendModel, is(equalTo(new TestingBackendModel(prop1, prop2)))); } } class Property2Builder extends BaseSyncBuilder<TestingFrontendModel, TestingBackendModel> { @Override protected void build(TestingFrontendModel frontend, TestingBackendModel backend) { backend.setProperty2(frontend.getProperty2()); } }