How to use verify method of org.easymock.internal.MocksControl class

Best Easymock code snippet using org.easymock.internal.MocksControl.verify

Source:EasyMockModule.java Github

copy

Full Screen

...62 * <p/>63 * Mocks can also be created explicitly64 * todo javadoc65 * <p/>66 * Switching to the replay state and verifying expectations of all mocks (including the mocks created with67 * the createMock() method can be done by calling68 * the {@link #replay()} and {@link #verify()} methods.69 *70 * @author Filip Neven71 * @author Tim Ducheyne72 */73public class EasyMockModule implements Module {74 /* Property key for configuring whether verify() is automatically called on every mock object after each test method execution */75 public static final String PROPKEY_AUTO_VERIFY_AFTER_TEST_ENABLED = "EasyMockModule.autoVerifyAfterTest.enabled";76 /* All created mocks controls */77 private List<MocksControl> mocksControls;78 /* Map holding the default configuration of the mock annotations */79 private Map<Class<? extends Annotation>, Map<String, String>> defaultAnnotationPropertyValues;80 /* Indicates whether verify() is automatically called on every mock object after each test method execution */81 private boolean autoVerifyAfterTestEnabled;82 /**83 * Initializes the module84 */85 @Override86 @SuppressWarnings("unchecked")87 public void init(Properties configuration) {88 mocksControls = new ArrayList<MocksControl>();89 defaultAnnotationPropertyValues = getAnnotationPropertyDefaults(EasyMockModule.class, configuration, RegularMock.class, Mock.class);90 autoVerifyAfterTestEnabled = PropertyUtils.getBoolean(PROPKEY_AUTO_VERIFY_AFTER_TEST_ENABLED, configuration);91 }92 /**93 * No after initialization needed for this module94 */95 @Override96 public void afterInit() {97 }98 /**99 * Creates the listener for plugging in the behavior of this module into the test runs.100 *101 * @return the listener102 */103 @Override104 public TestListener getTestListener() {105 return new EasyMockTestListener();106 }107 /**108 * Creates an EasyMock mock object of the given type.109 * <p/>110 * An instance of the mock control is stored, so that it can be set to the replay/verify state when111 * {@link #replay()} or {@link #verify()} is called.112 *113 * @param <T> the type of the mock114 * @param mockType the class type for the mock, not null115 * @param invocationOrder the order setting, not null116 * @param calls the calls setting, not null117 * @return a mock for the given class or interface, not null118 */119 public <T> T createRegularMock(Class<T> mockType, InvocationOrder invocationOrder, Calls calls) {120 // Get anotation arguments and replace default values if needed121 invocationOrder = getEnumValueReplaceDefault(RegularMock.class, "invocationOrder", invocationOrder,122 defaultAnnotationPropertyValues);123 calls = getEnumValueReplaceDefault(RegularMock.class, "calls", calls, defaultAnnotationPropertyValues);124 MocksControl mocksControl;125 if (Calls.LENIENT == calls) {126 mocksControl = new MocksControl(NICE);127 } else {128 mocksControl = new MocksControl(DEFAULT);129 }130 // Check order131 if (InvocationOrder.STRICT == invocationOrder) {132 mocksControl.checkOrder(true);133 }134 mocksControls.add(mocksControl);135 return mocksControl.createMock(mockType);136 }137 /**138 * todo javadoc139 * <p/>140 * Creates an EasyMock mock instance of the given type (class/interface). The type of mock is determined141 * as follows:142 * <p/>143 * If returns is set to LENIENT, a nice mock is created, else a default mock is created144 * If arguments is lenient a lenient control is create, else an EasyMock control is created145 * If order is set to strict, invocation order checking is enabled146 *147 * @param <T> the type of the mock148 * @param mockType the type of the mock, not null149 * @param invocationOrder the order setting, not null150 * @param calls the calls setting, not null151 * @param order todo152 * @param dates todo153 * @param defaults todo154 * @return a mockcontrol for the given class or interface, not null155 */156 public <T> T createMock(Class<T> mockType, InvocationOrder invocationOrder, Calls calls, Order order, Dates dates, Defaults defaults) {157 // Get anotation arguments and replace default values if needed158 invocationOrder = getEnumValueReplaceDefault(Mock.class, "invocationOrder", invocationOrder, defaultAnnotationPropertyValues);159 calls = getEnumValueReplaceDefault(Mock.class, "calls", calls, defaultAnnotationPropertyValues);160 order = getEnumValueReplaceDefault(Mock.class, "order", order, defaultAnnotationPropertyValues);161 dates = getEnumValueReplaceDefault(Mock.class, "dates", dates, defaultAnnotationPropertyValues);162 defaults = getEnumValueReplaceDefault(Mock.class, "defaults", defaults, defaultAnnotationPropertyValues);163 List<ReflectionComparatorMode> comparatorModes = new ArrayList<ReflectionComparatorMode>();164 if (Order.LENIENT == order) {165 comparatorModes.add(LENIENT_ORDER);166 }167 if (Dates.LENIENT == dates) {168 comparatorModes.add(LENIENT_DATES);169 }170 if (Defaults.IGNORE_DEFAULTS == defaults) {171 comparatorModes.add(IGNORE_DEFAULTS);172 }173 LenientMocksControl mocksControl;174 if (Calls.LENIENT == calls) {175 mocksControl = new LenientMocksControl(NICE, comparatorModes.toArray(new ReflectionComparatorMode[0]));176 } else {177 mocksControl = new LenientMocksControl(DEFAULT, comparatorModes.toArray(new ReflectionComparatorMode[0]));178 }179 // Check order180 if (InvocationOrder.STRICT == invocationOrder) {181 mocksControl.checkOrder(true);182 }183 mocksControls.add(mocksControl);184 return mocksControl.createMock(mockType);185 }186 /**187 * Replays all mock controls.188 */189 public void replay() {190 for (MocksControl mocksControl : mocksControls) {191 mocksControl.replay();192 }193 }194 /**195 * Resets all mock controls.196 */197 public void reset() {198 for (MocksControl mocksControl : mocksControls) {199 mocksControl.reset();200 }201 }202 /**203 * This method makes sure {@link org.easymock.internal.MocksControl#verify} method is called for every mock mock object204 * that was injected to a field annotated with {@link Mock}, or directly created by calling205 * {@link #createRegularMock(Class, InvocationOrder, Calls)} or206 * {@link #createMock(Class, InvocationOrder, Calls, Order, Dates, Defaults)}.207 * <p/>208 * If there are mocks that weren't already switched to the replay state using {@link MocksControl#replay()}} or by209 * calling {@link org.unitils.easymock.EasyMockUnitils#replay()}, this method is called first.210 */211 public void verify() {212 for (MocksControl mocksControl : mocksControls) {213 if (!(mocksControl.getState() instanceof ReplayState)) {214 mocksControl.replay();215 }216 mocksControl.verify();217 }218 }219 /**220 * Creates and sets a mock for all {@link RegularMock} annotated fields.221 * <p/>222 * The223 * todo javadoc224 * method is called for creating the mocks. Ones the mock is created, all methods annotated with {@link AfterCreateMock} will be called passing the created mock.225 *226 * @param testObject the test, not null227 */228 protected void createAndInjectRegularMocksIntoTest(Object testObject) {229 Set<Field> mockFields = getFieldsAnnotatedWith(testObject.getClass(), RegularMock.class);230 for (Field mockField : mockFields) {231 Class<?> mockType = mockField.getType();232 RegularMock regularMockAnnotation = mockField.getAnnotation(RegularMock.class);233 Object mockObject = createRegularMock(mockType, regularMockAnnotation.invocationOrder(), regularMockAnnotation.calls());234 setFieldValue(testObject, mockField, mockObject);235 callAfterCreateMockMethods(testObject, mockObject, mockField.getName(), mockType);236 }237 }238 //todo javadoc239 protected void createAndInjectMocksIntoTest(Object testObject) {240 Set<Field> mockFields = getFieldsAnnotatedWith(testObject.getClass(), Mock.class);241 for (Field mockField : mockFields) {242 Class<?> mockType = mockField.getType();243 Mock mockAnnotation = mockField.getAnnotation(Mock.class);244 Object mockObject = createMock(mockType, mockAnnotation.invocationOrder(), mockAnnotation.calls(), mockAnnotation.order(), mockAnnotation.dates(), mockAnnotation.defaults());245 setFieldValue(testObject, mockField, mockObject);246 callAfterCreateMockMethods(testObject, mockObject, mockField.getName(), mockType);247 }248 }249 /**250 * Calls all {@link AfterCreateMock} annotated methods on the test, passing the given mock.251 * These annotated methods must have following signature <code>void myMethod(Object mock, String name, Class type)</code>.252 * If this is not the case, a runtime exception is called.253 *254 * @param testObject the test, not null255 * @param mockObject the mock, not null256 * @param name the field(=mock) name, not null257 * @param type the field(=mock) type258 */259 protected void callAfterCreateMockMethods(Object testObject, Object mockObject, String name, Class<?> type) {260 Set<Method> methods = getMethodsAnnotatedWith(testObject.getClass(), AfterCreateMock.class);261 for (Method method : methods) {262 try {263 invokeMethod(testObject, method, mockObject, name, type);264 } catch (InvocationTargetException e) {265 throw new UnitilsException("An exception occurred while invoking an after create mock method.", e);266 } catch (Exception e) {267 throw new UnitilsException("Unable to invoke after create mock method. Ensure that this method has following signature: " +268 "void myMethod(Object mock, String name, Class type)", e);269 }270 }271 }272 273 public void addMocksControlToList(MocksControl control) {274 mocksControls.add(control);275 }276 /**277 * Test listener that handles the mock creation and injection.278 */279 protected class EasyMockTestListener extends TestListener {280 /**281 * Before the test is executed this calls {@link EasyMockModule#createAndInjectRegularMocksIntoTest(Object)} to282 * create and inject all mocks on the class.283 */284 @Override285 public void beforeTestSetUp(Object testObject, Method testMethod) {286 // Clear all previously created mocks controls287 mocksControls.clear();288 createAndInjectRegularMocksIntoTest(testObject);289 createAndInjectMocksIntoTest(testObject);290 }291 /**292 * After each test is executed this calls {@link EasyMockModule#verify()} to verify the recorded behavior293 * of all created mocks.294 */295 @Override296 public void afterTestMethod(Object testObject, Method testMethod, Throwable throwable) {297 if (autoVerifyAfterTestEnabled && throwable == null) {298 verify();299 }300 }301 }302}...

Full Screen

Full Screen

Source:TrackWriterTest.java Github

copy

Full Screen

...137 writer.setOnCompletion(completionCallback);138 writer.writeTrack();139 assertEquals(1, writeDocumentCalls);140 assertEquals(1, openFileCalls);141 mocksControl.verify();142 }143 public void testWriteTrack_openFails() {144 writer = new WriteTracksTrackWriter(getContext(), providerUtils, track,145 formatWriter, false);146 // Expect the completion callback to be run147 Runnable completionCallback = mocksControl.createMock(Runnable.class);148 completionCallback.run();149 mocksControl.replay();150 writer.setOnCompletion(completionCallback);151 writer.writeTrack();152 assertEquals(0, writeDocumentCalls);153 assertEquals(1, openFileCalls);154 mocksControl.verify();155 }156 157 public void testOpenFile() {158 final ByteArrayOutputStream stream = new ByteArrayOutputStream();159 writer = new OpenFileTrackWriter(160 getContext(), providerUtils, track, formatWriter, stream, true);161 formatWriter.prepare(track, stream);162 mocksControl.replay();163 assertTrue(writer.openFile());164 mocksControl.verify();165 }166 public void testOpenFile_cantWrite() {167 final ByteArrayOutputStream stream = new ByteArrayOutputStream();168 writer = new OpenFileTrackWriter(169 getContext(), providerUtils, track, formatWriter, stream, false);170 mocksControl.replay();171 assertFalse(writer.openFile());172 mocksControl.verify();173 }174 public void testOpenFile_streamError() {175 writer = new OpenFileTrackWriter(176 getContext(), providerUtils, track, formatWriter, null, true);177 mocksControl.replay();178 assertFalse(writer.openFile());179 mocksControl.verify();180 }181 public void testWriteDocument_emptyTrack() {182 writer = new TrackWriter(getContext(), providerUtils, track, formatWriter);183 // Don't let it write any waypoints184 expect(providerUtils.getWaypointsCursor(185 TRACK_ID, 0, MyTracksConstants.MAX_LOADED_WAYPOINTS_POINTS))186 .andStubReturn(null);187 // Set expected mock behavior188 formatWriter.writeHeader();189 formatWriter.writeFooter();190 formatWriter.close();191 mocksControl.replay();192 writer.writeDocument();193 assertTrue(writer.wasSuccess());194 mocksControl.verify();195 }196 public void testWriteDocument() {197 writer = new TrackWriter(getContext(), providerUtils, track, formatWriter);198 Location l1 = new Location("fake1");199 Location l2 = new Location("fake2");200 Location l3 = new Location("fake3");201 Location l4 = new Location("fake4");202 Location l5 = new Location("fake5");203 Location l6 = new Location("fake6");204 Waypoint p1 = new Waypoint();205 Waypoint p2 = new Waypoint();206 addLocations(l1, l2, l3, l4, l5, l6);207 stubBufferFill(208 new Location[] { l1, l2, l3, l4 },209 new Location[] { l5, l6 });210 track.setStopId(6L);211 // Make location 3 invalid212 l3.setLatitude(100);213 // Begin the track214 formatWriter.writeHeader();215 formatWriter.writeBeginTrack(l1);216 // Write locations 1-2217 formatWriter.writeOpenSegment();218 formatWriter.writeLocation(l1);219 formatWriter.writeLocation(l2);220 formatWriter.writeCloseSegment();221 // Location 3 is not written - it's invalid222 // Write locations 4-6223 formatWriter.writeOpenSegment();224 formatWriter.writeLocation(l4);225 formatWriter.writeLocation(l5);226 formatWriter.writeLocation(l6);227 formatWriter.writeCloseSegment();228 // End the track229 formatWriter.writeEndTrack(l6);230 // Expect reading/writing of the waypoints231 Cursor cursor = mocksControl.createMock(Cursor.class);232 expect(providerUtils.getWaypointsCursor(233 TRACK_ID, 0, MyTracksConstants.MAX_LOADED_WAYPOINTS_POINTS))234 .andStubReturn(cursor);235 expect(cursor.moveToFirst()).andReturn(true);236 expect(cursor.moveToNext()).andReturn(true);237 expect(providerUtils.createWaypoint(cursor)).andReturn(p1);238 formatWriter.writeWaypoint(p1);239 expect(cursor.moveToNext()).andReturn(true);240 expect(providerUtils.createWaypoint(cursor)).andReturn(p2);241 formatWriter.writeWaypoint(p2);242 expect(cursor.moveToNext()).andReturn(false).anyTimes();243 cursor.close();244 formatWriter.writeFooter();245 formatWriter.close();246 mocksControl.replay();247 writer.writeDocument();248 assertTrue(writer.wasSuccess());249 mocksControl.verify();250 }251 private void addLocations(Location... locs) {252 assertTrue(locs.length < 90);253 for (int i = 0; i < locs.length; i++) {254 Location location = locs[i];255 location.setLatitude(i + 1);256 location.setLongitude(i + 1);257 }258 }259 /**260 * Defines the behaviour of filling the track buffer when a read is261 * requested.262 * The IDs of the locations will be their sequential number.263 *...

Full Screen

Full Screen

verify

Using AI Code Generation

copy

Full Screen

1package com.easymock.test;2import org.easymock.internal.MocksControl;3import org.easymock.EasyMock;4import org.easymock.IArgumentMatcher;5import org.easymock.IExpectationSetters;6import org.easymock.IMocksControl;7import org.junit.Test;8public class Test1 {9 public void test() {10 IMocksControl control = EasyMock.createControl();11 MocksControl.verify(control);12 }13}14 at org.easymock.internal.MocksControl.verify(MocksControl.java:72)15 at com.easymock.test.Test1.test(Test1.java:14)16 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)17 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)18 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)19 at java.lang.reflect.Method.invoke(Method.java:601)20 at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)21 at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)22 at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)23 at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)24 at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)25 at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)26 at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)27 at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)28 at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)29 at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)30 at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)31 at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)32 at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)33 at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)34 at org.junit.runners.ParentRunner.run(ParentRunner.java:309)35 at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)

Full Screen

Full Screen

verify

Using AI Code Generation

copy

Full Screen

1package com.easymock;2import org.easymock.EasyMock;3import org.easymock.IMocksControl;4public class MockControl {5 public static void main(String[] args) {6 IMocksControl control = EasyMock.createControl();7 Foo foo = control.createMock(Foo.class);8 foo.doSomething();9 control.verify();10 }11}12package com.easymock;13import org.easymock.EasyMock;14import org.easymock.IMocksControl;15public class MockControl {16 public static void main(String[] args) {17 IMocksControl control = EasyMock.createControl();18 Foo foo = control.createMock(Foo.class);19 EasyMock.expect(foo.doSomething()).andReturn("Hello World");20 control.verify();21 }22}23package com.easymock;24import org.easymock.EasyMock;25import org.easymock.IMocksControl;26public class MockControl {27 public static void main(String[] args) {28 IMocksControl control = EasyMock.createControl();29 Foo foo = control.createMock(Foo.class);30 foo.doSomething();31 EasyMock.expectLastCall().anyTimes();32 control.verify();33 }34}35package com.easymock;36import org.easymock.EasyMock;37import org.easymock.IMocksControl;38public class MockControl {39 public static void main(String[] args) {40 IMocksControl control = EasyMock.createControl();41 Foo foo = control.createMock(Foo.class);42 EasyMock.expect(foo.doSomething()).andStubReturn("Hello World");43 control.verify();44 }45}46package com.easymock;47import org.easymock.EasyMock;48import org.easymock.IMocksControl;49public class MockControl {50 public static void main(String[] args) {51 IMocksControl control = EasyMock.createControl();

Full Screen

Full Screen

verify

Using AI Code Generation

copy

Full Screen

1package com.easymock.example;2import java.util.List;3import org.easymock.EasyMock;4import org.easymock.IMocksControl;5public class Example1 {6 public static void main(String[] args) {7 IMocksControl control = EasyMock.createControl();8 List mockList = control.createMock(List.class);9 mockList.add("one");10 mockList.clear();11 control.replay();12 mockList.add("one");13 mockList.clear();14 control.verify();15 }16}17package com.easymock.example;18import java.util.List;19import org.easymock.EasyMock;20import org.easymock.IMocksControl;21public class Example2 {22 public static void main(String[] args) {23 IMocksControl control = EasyMock.createControl();24 List mockList = control.createMock(List.class);25 mockList.add("one");26 mockList.clear();27 control.replay();28 mockList.add("one");29 mockList.clear();30 control.verify();31 }32}33package com.easymock.example;34import java.util.List;35import org.easymock.EasyMock;36import org.easymock.IMocksControl;37public class Example3 {38 public static void main(String[] args) {39 IMocksControl control = EasyMock.createControl();40 List mockList = control.createMock(List.class);41 mockList.add("one");42 mockList.clear();43 control.replay();44 mockList.add("one");45 mockList.clear();46 control.verify();47 }48}

Full Screen

Full Screen

verify

Using AI Code Generation

copy

Full Screen

1package com.easymock;2import org.easymock.EasyMock;3import org.easymock.EasyMockSupport;4import junit.framework.TestCase;5public class Test extends TestCase {6 public void test() {7 Foo foo = EasyMock.createMock(Foo.class);8 foo.bar();9 EasyMock.verify(foo);10 }11}12package com.easymock;13import org.easymock.EasyMock;14import org.easymock.EasyMockSupport;15import junit.framework.TestCase;16public class Test extends TestCase {17 public void test() {18 Foo foo = EasyMock.createMock(Foo.class);19 foo.bar();20 EasyMockSupport.verifyAll();21 }22}23package com.easymock;24import org.easymock.EasyMock;25import org.easymock.EasyMockSupport;26import junit.framework.TestCase;27public class Test extends TestCase {28 public void test() {29 Foo foo = EasyMock.createMock(Foo.class);30 foo.bar();31 EasyMockSupport.verifyAll();32 }33}34package com.easymock;35import org.easymock.EasyMock;36import org.easymock.EasyMockSupport;37import junit.framework.TestCase;38public class Test extends TestCase {39 public void test() {40 Foo foo = EasyMock.createMock(Foo.class);41 foo.bar();42 EasyMockSupport.verifyAll();43 }44}45package com.easymock;46import org.eas

Full Screen

Full Screen

verify

Using AI Code Generation

copy

Full Screen

1package org.easymock;2import java.util.*;3import java.io.*;4import java.lang.*;5import org.easymock.*;6import org.easymock.internal.*;7{8public static void main(String args[])9{10List mockList = EasyMock.createMock(List.class);11mockList.add("one");12mockList.clear();13EasyMock.replay(mockList);14mockList.add("one");15mockList.clear();16MocksControl.verify(mockList);17}18}19Exception in thread "main" java.lang.AssertionError: Expected call: List.clear()20Expected #0, actual #1: List.add("one")21at org.easymock.internal.MocksControl.verify(MocksControl.java:96)22at 1.main(1.java:26)23package org.easymock;24import java.util.*;25import java.io.*;26import java.lang.*;27import org.easymock.*;28import org.easymock.internal.*;29{30public static void main(String args[])31{32List mockList = EasyMock.createMock(List.class);33mockList.add("one");34mockList.clear();35EasyMock.replay(mockList);36mockList.add("one");37mockList.clear();38EasyMock.verify(mockList);39}40}41Exception in thread "main" java.lang.AssertionError: Expected call: List.clear()42Expected #0, actual #1: List.add("one")43at org.easymock.internal.MocksControl.verify(MocksControl.java:96)

Full Screen

Full Screen

verify

Using AI Code Generation

copy

Full Screen

1public class Test {2 public static void main(String[] args) {3 MocksControl ctrl = new MocksControl();4 ITest mock = (ITest) ctrl.getMock();5 mock.testMethod(1);6 mock.testMethod(2);7 mock.testMethod(3);8 ctrl.verify();9 }10}11java.lang.AssertionError: Expected 1 call(s) to method testMethod, but got 012 at org.easymock.internal.MocksControl.verify(MocksControl.java:187)13 at Test.main(Test.java:9)14java.lang.AssertionError: Expected 1 call(s) to method testMethod, but got 015 at org.easymock.internal.MocksControl.verify(MocksControl.java:187)16 at Test.main(Test.java:10)17java.lang.AssertionError: Expected 1 call(s) to method testMethod, but got 018 at org.easymock.internal.MocksControl.verify(MocksControl.java:187)19 at Test.main(Test.java:11)

Full Screen

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful