/** * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. * * Copyright 2012-2015 the original author or authors. */ package org.assertj.swing.test.core; import static java.util.Arrays.deepEquals; import static org.assertj.core.api.Fail.fail; import static org.assertj.core.util.Preconditions.checkNotNull; import static org.assertj.core.util.Strings.concat; import static org.assertj.core.util.Strings.quote; import static org.assertj.swing.util.Arrays.copyOf; import static org.assertj.swing.util.Arrays.format; import static org.assertj.swing.util.Maps.newHashMap; import java.util.Map; import javax.annotation.Nonnull; import javax.annotation.Nullable; /** * Mechanism to record and verify expected method invocations. * * @author Alex Ruiz * @author Yvonne Wang */ public class MethodInvocations { private final Map<String, Object[]> invocations = newHashMap(); /** * Records that a method with the given name was invoked. * * @param methodName the name of the invoked method. * @return {@code this}. */ public @Nonnull MethodInvocations invoked(@Nonnull String methodName) { invocations.put(methodName, new Object[0]); return this; } /** * Records that a method with the given name was invoked with the given arguments. * * @param methodName the name of the invoked method. * @param args the arguments passed to the invoked method. * @return {@code this}. */ public @Nonnull MethodInvocations invoked(@Nonnull String methodName, @Nonnull Args args) { checkNotNull(args); invocations.put(methodName, args.args); return this; } /** * Verifies that a method with the given name was invoked. * * @param methodName the name of the method to verify. * @return {@code this}. * @throws AssertionError if the method was not invoked. */ public @Nonnull MethodInvocations requireInvoked(@Nonnull String methodName) { if (!invocations.containsKey(methodName)) { methodNotInvoked(methodName); } return this; } /** * Verifies that a method with the given name was invoked with the given arguments. * * @param methodName the name of the method to verify. * @param args the arguments that should have been passed to the method to verify. * @return {@code this}. * @throws AssertionError if the method was not invoked. * @throws AssertionError if different arguments were passed to the method to verify. */ public @Nonnull MethodInvocations requireInvoked(@Nonnull String methodName, @Nonnull Args args) { checkNotNull(args); if (!invocations.containsKey(methodName)) { methodNotInvoked(methodName); } Object[] actual = args.args; Object[] expected = invocations.get(methodName); if (!deepEquals(actual, expected)) { fail(concat("Expecting arguments ", format(actual), " but found ", format(expected))); } return this; } private void methodNotInvoked(@Nonnull String methodName) { fail(concat("expecting method ", quote(methodName), " to be invoked")); } /** * List of arguments passed to a method. * * @author Alex Ruiz * @author Yvonne Wang */ public static class Args { final Object[] args; /** * Creates a new {@link Args}. * * @param args the arguments to store. * @return the created {@code Args}. */ public static @Nonnull Args args(@Nullable Object... args) { return new Args(args); } private Args(@Nullable Object... args) { this.args = args != null ? copyOf(args) : new Object[0]; } } }