Skip to content

Package: ContainerRevealProvider_ITest$1

ContainerRevealProvider_ITest$1

nameinstructionbranchcomplexitylinemethod
bid(VElement, EObject)
M: 0 C: 14
100%
M: 1 C: 3
75%
M: 1 C: 2
67%
M: 0 C: 1
100%
M: 0 C: 1
100%
create(VElement, EObject)
M: 1 C: 16
94%
M: 2 C: 2
50%
M: 2 C: 1
33%
M: 1 C: 2
67%
M: 0 C: 1
100%
{...}
M: 0 C: 12
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%

Coverage

1: /*******************************************************************************
2: * Copyright (c) 2019 Christian W. Damus and others.
3: *
4: * All rights reserved. This program and the accompanying materials
5: * are made available under the terms of the Eclipse Public License 2.0
6: * which accompanies this distribution, and is available at
7: * https://www.eclipse.org/legal/epl-2.0/
8: *
9: * SPDX-License-Identifier: EPL-2.0
10: *
11: * Contributors:
12: * Christian W. Damus - initial API and implementation
13: ******************************************************************************/
14: package org.eclipse.emfforms.internal.swt.core;
15:
16: import static org.junit.Assert.assertThat;
17: import static org.mockito.Mockito.mock;
18: import static org.mockito.Mockito.verify;
19:
20: import org.eclipse.emf.ecore.EObject;
21: import org.eclipse.emf.ecp.test.common.DefaultRealm;
22: import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
23: import org.eclipse.emf.ecp.view.spi.label.model.VLabelFactory;
24: import org.eclipse.emf.ecp.view.spi.model.VContainedContainer;
25: import org.eclipse.emf.ecp.view.spi.model.VContainedElement;
26: import org.eclipse.emf.ecp.view.spi.model.VContainer;
27: import org.eclipse.emf.ecp.view.spi.model.VElement;
28: import org.eclipse.emf.ecp.view.spi.model.VView;
29: import org.eclipse.emf.ecp.view.spi.model.VViewFactory;
30: import org.eclipse.emf.ecp.view.spi.vertical.model.VVerticalFactory;
31: import org.eclipse.emf.ecp.view.test.common.spi.EMFFormsRevealServiceFixture;
32: import org.eclipse.emf.ecp.view.test.common.spi.EMFFormsViewContextFixture.DomainModel;
33: import org.eclipse.emf.ecp.view.test.common.spi.EMFFormsViewContextFixture.ViewModel;
34: import org.eclipse.emf.ecp.view.test.common.spi.EMFMockingRunner;
35: import org.eclipse.emf.ecp.view.test.common.spi.EMock;
36: import org.eclipse.emf.ecp.view.test.common.swt.spi.SWTTestUtil;
37: import org.eclipse.emf.ecp.view.test.common.swt.spi.SWTViewTestHelper;
38: import org.eclipse.emfforms.bazaar.Bid;
39: import org.eclipse.emfforms.bazaar.Create;
40: import org.eclipse.emfforms.spi.core.services.reveal.EMFFormsRevealProvider;
41: import org.eclipse.emfforms.spi.core.services.reveal.RevealStep;
42: import org.eclipse.jface.layout.GridDataFactory;
43: import org.eclipse.swt.SWT;
44: import org.eclipse.swt.custom.ScrolledComposite;
45: import org.eclipse.swt.layout.GridLayout;
46: import org.eclipse.swt.widgets.Composite;
47: import org.eclipse.swt.widgets.Shell;
48: import org.hamcrest.CustomTypeSafeMatcher;
49: import org.hamcrest.Matcher;
50: import org.junit.After;
51: import org.junit.Before;
52: import org.junit.Rule;
53: import org.junit.Test;
54: import org.junit.rules.TestRule;
55: import org.junit.runner.RunWith;
56:
57: /**
58: * Tests covering the {@link ContainerRevealProvider} class.
59: */
60: @SuppressWarnings("nls")
61: @RunWith(EMFMockingRunner.class)
62: public class ContainerRevealProvider_ITest {
63:
64:         @ViewModel
65:         private final VView view = VViewFactory.eINSTANCE.createView();
66:
67:         @EMock
68:         @DomainModel
69:         private EObject rootObject;
70:
71:         @EMock
72:         private EObject obj1;
73:
74:         @Rule
75:         public final TestRule realm = DefaultRealm.rule();
76:
77:         @Rule
78:         public final EMFFormsRevealServiceFixture<ViewModelContext> fixture = EMFFormsRevealServiceFixture.create(
79:                 ViewModelContext.class, this);
80:
81:         private Shell shell;
82:         private ScrolledComposite scrollPane;
83:
84:         /**
85:          * Initializes me.
86:          */
87:         public ContainerRevealProvider_ITest() {
88:                 super();
89:         }
90:
91:         @Test
92:         public void revealWithScroll() {
93:                 final VContainer top = (VContainer) view.getChildren().get(0);
94:                 final VContainer lastContainer = (VContainer) top.getChildren().get(top.getChildren().size() - 1);
95:                 final VContainedElement label = lastContainer.getChildren().get(0);
96:
97:                 final Runnable reveal = mock(Runnable.class);
98:
99:                 final EMFFormsRevealProvider compositeRevealer = new EMFFormsRevealProvider() {
100:                         @Bid
101:                         public Double bid(VElement view, EObject model) {
102:•                                return view == label && model == obj1 ? Double.MAX_VALUE : null;
103:                         }
104:
105:                         @Create
106:                         public RevealStep create(VElement view, EObject model) {
107:•                                return view == label && model == obj1
108:                                         ? RevealStep.reveal(view, model, reveal)
109:                                         : RevealStep.fail();
110:                         }
111:                 };
112:                 fixture.addRevealProvider(compositeRevealer);
113:
114:                 render();
115:
116:                 SWTTestUtil.waitForUIThread();
117:
118:                 fixture.reveal(obj1);
119:
120:                 SWTTestUtil.waitForUIThread();
121:
122:                 verify(reveal).run();
123:
124:                 SWTTestUtil.waitForUIThread();
125:
126:                 // Check that the scroll pane was scrolled to reveal the label
127:                 assertThat("Composite not scrolled", scrollPane.getVerticalBar().getSelection(), greaterThan(5));
128:         }
129:
130:         //
131:         // Test framework
132:         //
133:
134:         @Before
135:         public void createViewModel() {
136:                 final VContainedContainer container = VVerticalFactory.eINSTANCE.createVerticalLayout();
137:                 view.getChildren().add(container);
138:
139:                 // Create enough groups with labels in them that a scroll will certainly
140:                 // be required to reveal the last of them
141:                 for (int i = 0; i < 50; i++) {
142:                         final VContainedContainer vertical = VVerticalFactory.eINSTANCE.createVerticalLayout();
143:                         container.getChildren().add(vertical);
144:                         final VContainedElement label = VLabelFactory.eINSTANCE.createLabel();
145:                         vertical.getChildren().add(label);
146:                         label.setName("Label " + (i + 1));
147:                         label.setLabel(label.getName());
148:                 }
149:         }
150:
151:         @Before
152:         public void createShell() {
153:                 shell = new Shell();
154:                 shell.setLayout(new GridLayout());
155:                 scrollPane = new ScrolledComposite(shell, SWT.V_SCROLL);
156:                 scrollPane.setAlwaysShowScrollBars(true); // Useful for testing feedback
157:                 scrollPane.setExpandHorizontal(true);
158:                 scrollPane.setExpandVertical(true);
159:                 GridDataFactory.fillDefaults().grab(true, true).applyTo(scrollPane);
160:                 final Composite content = new Composite(scrollPane, SWT.NONE);
161:                 content.setLayout(new GridLayout());
162:                 scrollPane.setContent(content);
163:         }
164:
165:         @After
166:         public void destroyShell() {
167:                 shell.dispose();
168:                 shell = null;
169:         }
170:
171:         void render() {
172:                 SWTViewTestHelper.render(fixture.getViewContext(), (Composite) scrollPane.getContent());
173:
174:                 // Ensure that we can scroll the client area
175:                 scrollPane.setMinSize(scrollPane.getContent().computeSize(SWT.DEFAULT, SWT.DEFAULT));
176:                 shell.layout();
177:                 shell.setSize(500, 300);
178:                 shell.open();
179:         }
180:
181:         static <N extends Number & Comparable<N>> Matcher<N> greaterThan(N lowerBound) {
182:                 return new CustomTypeSafeMatcher<N>("> " + lowerBound) {
183:                         @Override
184:                         protected boolean matchesSafely(N item) {
185:                                 return item.compareTo(lowerBound) > 0;
186:                         }
187:                 };
188:         }
189:
190: }