All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.assertj.swing.driver.JScrollBarDriver Maven / Gradle / Ivy

There is a newer version: 3.17.1
Show newest version
/**
 * 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.driver;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.util.Preconditions.checkNotNull;
import static org.assertj.core.util.Strings.concat;
import static org.assertj.swing.driver.ComponentPreconditions.checkEnabledAndShowing;
import static org.assertj.swing.driver.JScrollBarSetValueTask.setValue;
import static org.assertj.swing.driver.JScrollBarValueQuery.valueOf;
import static org.assertj.swing.edt.GuiActionRunner.execute;

import java.awt.Point;

import javax.annotation.Nonnull;
import javax.swing.JScrollBar;

import org.assertj.swing.annotation.RunsInCurrentThread;
import org.assertj.swing.annotation.RunsInEDT;
import org.assertj.swing.core.Robot;
import org.assertj.swing.edt.GuiQuery;
import org.assertj.swing.internal.annotation.InternalApi;
import org.assertj.swing.util.GenericRange;
import org.assertj.swing.util.Pair;

/**
 * 

* Supports functional testing of {@code JScrollBar}s. *

* *

* Note: This class is intended for internal use only. Please use the classes in the package * {@link org.assertj.swing.fixture} in your tests. *

* * @author Yvonne Wang * @author Alex Ruiz */ @InternalApi public class JScrollBarDriver extends JComponentDriver { private static final String VALUE_PROPERTY = "value"; private final JScrollBarLocation location = new JScrollBarLocation(); /** * Creates a new {@link JScrollBarDriver}. * * @param robot the robot to use to simulate user input. */ public JScrollBarDriver(@Nonnull Robot robot) { super(robot); } /** * Scrolls up (or left) one unit (usually a line). * * @param scrollBar the target {@code JScrollBar}. */ public void scrollUnitUp(@Nonnull JScrollBar scrollBar) { scrollUnitUp(scrollBar, 1); } /** * Scrolls up (or left) one unit (usually a line,) the given number of times. * * @param scrollBar the target {@code JScrollBar}. * @param times the number of times to scroll up one unit. * @throws IllegalArgumentException if {@code times} is less than or equal to zero. * @throws IllegalStateException if the {@code JScrollBar} is disabled. * @throws IllegalStateException if the {@code JScrollBar} is not showing on the screen. */ public void scrollUnitUp(@Nonnull JScrollBar scrollBar, int times) { checkPositive(times, "scroll up one unit"); Pair scrollInfo = findScrollUnitInfo(scrollBar, location(), times * -1); scroll(scrollBar, scrollInfo); } /** * Scrolls down (or right) one unit (usually a line). * * @param scrollBar the target {@code JScrollBar}. */ public void scrollUnitDown(@Nonnull JScrollBar scrollBar) { scrollUnitDown(scrollBar, 1); } /** * Scrolls down (or right) one unit (usually a line,) the given number of times. * * @param scrollBar the target {@code JScrollBar}. * @param times the number of times to scroll down one unit. * @throws IllegalArgumentException if {@code times} is less than or equal to zero. * @throws IllegalStateException if the {@code JScrollBar} is disabled. * @throws IllegalStateException if the {@code JScrollBar} is not showing on the screen. */ public void scrollUnitDown(@Nonnull JScrollBar scrollBar, int times) { checkPositive(times, "scroll down one unit"); Pair scrollInfo = findScrollUnitInfo(scrollBar, location(), times); scroll(scrollBar, scrollInfo); } @RunsInEDT private static @Nonnull Pair findScrollUnitInfo(final @Nonnull JScrollBar scrollBar, final @Nonnull JScrollBarLocation location, final int times) { Pair result = execute(new GuiQuery>() { @Override protected Pair executeInEDT() { checkEnabledAndShowing(scrollBar); return scrollUnitInfo(scrollBar, location, times); } }); return checkNotNull(result); } @RunsInCurrentThread private static @Nonnull Pair scrollUnitInfo(@Nonnull JScrollBar scrollBar, @Nonnull JScrollBarLocation location, int times) { Point where = blockLocation(scrollBar, location, times); int count = times * scrollBar.getUnitIncrement(); return Pair.of(where, scrollBar.getValue() + count); } /** * Scrolls up (or left) one block (usually a page). * * @param scrollBar the target {@code JScrollBar}. */ @RunsInEDT public void scrollBlockUp(@Nonnull JScrollBar scrollBar) { scrollBlockUp(scrollBar, 1); } /** * Scrolls up (or left) one block (usually a page,) the given number of times. * * @param scrollBar the target {@code JScrollBar}. * @param times the number of times to scroll up one block. * @throws IllegalArgumentException if {@code times} is less than or equal to zero. * @throws IllegalStateException if the {@code JScrollBar} is disabled. * @throws IllegalStateException if the {@code JScrollBar} is not showing on the screen. */ @RunsInEDT public void scrollBlockUp(@Nonnull JScrollBar scrollBar, int times) { checkPositive(times, "scroll up one block"); Pair scrollInfo = validateAndFindScrollBlockInfo(scrollBar, location(), times * -1); scroll(scrollBar, scrollInfo); } /** * Scrolls down (or right) one block (usually a page). * * @param scrollBar the target {@code JScrollBar}. */ @RunsInEDT public void scrollBlockDown(@Nonnull JScrollBar scrollBar) { scrollBlockDown(scrollBar, 1); } /** * Scrolls down (or right) one block (usually a page,) the given number of times. * * @param scrollBar the target {@code JScrollBar}. * @param times the number of times to scroll down one block. * @throws IllegalArgumentException if {@code times} is less than or equal to zero. * @throws IllegalStateException if the {@code JScrollBar} is disabled. * @throws IllegalStateException if the {@code JScrollBar} is not showing on the screen. */ @RunsInEDT public void scrollBlockDown(@Nonnull JScrollBar scrollBar, int times) { checkPositive(times, "scroll down one block"); Pair scrollInfo = validateAndFindScrollBlockInfo(scrollBar, location(), times); scroll(scrollBar, scrollInfo); } private void checkPositive(int times, @Nonnull String action) { if (times > 0) { return; } String msg = String.format("The number of times to %s should be greater than zero, but was <%d>", action, times); throw new IllegalArgumentException(msg); } @RunsInEDT private static @Nonnull Pair validateAndFindScrollBlockInfo(final @Nonnull JScrollBar scrollBar, final @Nonnull JScrollBarLocation location, final int times) { Pair result = execute(new GuiQuery>() { @Override protected Pair executeInEDT() { checkEnabledAndShowing(scrollBar); return scrollBlockInfo(scrollBar, location, times); } }); return checkNotNull(result); } @RunsInCurrentThread private static Pair scrollBlockInfo(@Nonnull JScrollBar scrollBar, @Nonnull JScrollBarLocation location, int times) { Point where = blockLocation(scrollBar, location, times); int count = times * scrollBar.getBlockIncrement(); return Pair.of(where, scrollBar.getValue() + count); } @RunsInCurrentThread private static @Nonnull Point blockLocation(@Nonnull JScrollBar scrollBar, @Nonnull JScrollBarLocation location, int times) { return times > 0 ? location.blockLocationToScrollDown(scrollBar) : location.blockLocationToScrollUp(scrollBar); } @RunsInEDT private void scroll(@Nonnull JScrollBar scrollBar, @Nonnull Pair scrollInfo) { // For now, do it programmatically, faking the mouse movement and clicking robot.moveMouse(scrollBar, checkNotNull(scrollInfo.first)); setValueProperty(scrollBar, scrollInfo.second); } /** * Scrolls to the maximum position of the given {@code JScrollBar}. * * @param scrollBar the target {@code JScrollBar}. * @throws IllegalStateException if the {@code JScrollBar} is disabled. * @throws IllegalStateException if the {@code JScrollBar} is not showing on the screen. */ @RunsInEDT public void scrollToMaximum(@Nonnull JScrollBar scrollBar) { Pair> scrollInfo = findScrollToMaximumInfo(scrollBar, location()); scroll(scrollBar, scrollInfo.first, checkNotNull(scrollInfo.second)); } @RunsInEDT private static @Nonnull Pair> findScrollToMaximumInfo( final @Nonnull JScrollBar scrollBar, final @Nonnull JScrollBarLocation location) { Pair> result = execute(new GuiQuery>>() { @Override protected Pair> executeInEDT() { checkEnabledAndShowing(scrollBar); int position = scrollBar.getMaximum(); GenericRange scrollInfo = scrollInfo(scrollBar, location, position); return Pair.of(position, scrollInfo); } }); return checkNotNull(result); } /** * Scrolls to the minimum position of the given {@code JScrollBar}. * * @param scrollBar the target {@code JScrollBar}. * @throws IllegalStateException if the {@code JScrollBar} is disabled. * @throws IllegalStateException if the {@code JScrollBar} is not showing on the screen. */ @RunsInEDT public void scrollToMinimum(@Nonnull JScrollBar scrollBar) { Pair> scrollInfo = findScrollToMinimumInfo(scrollBar, location); scroll(scrollBar, scrollInfo.first, checkNotNull(scrollInfo.second)); } @RunsInEDT private static @Nonnull Pair> findScrollToMinimumInfo( final @Nonnull JScrollBar scrollBar, final JScrollBarLocation location) { Pair> result = execute(new GuiQuery>>() { @Override protected Pair> executeInEDT() { checkEnabledAndShowing(scrollBar); int position = scrollBar.getMinimum(); GenericRange scrollInfo = scrollInfo(scrollBar, location, position); return Pair.of(position, scrollInfo); } }); return checkNotNull(result); } /** * Scrolls to the given position. * * @param scrollBar the target {@code JScrollBar}. * @param position the position to scroll to. * @throws IllegalStateException if the {@code JScrollBar} is disabled. * @throws IllegalStateException if the {@code JScrollBar} is not showing on the screen. * @throws IllegalArgumentException if the given position is not within the {@code JScrollBar} bounds. */ @RunsInEDT public void scrollTo(@Nonnull JScrollBar scrollBar, int position) { GenericRange scrollInfo = validateAndFindScrollInfo(scrollBar, location(), position); scroll(scrollBar, position, scrollInfo); } @RunsInEDT private static @Nonnull GenericRange validateAndFindScrollInfo(final @Nonnull JScrollBar scrollBar, final @Nonnull JScrollBarLocation location, final int position) { GenericRange result = execute(new GuiQuery>() { @Override protected GenericRange executeInEDT() { checkPositionInBounds(scrollBar, position); checkEnabledAndShowing(scrollBar); return scrollInfo(scrollBar, location, position); } }); return checkNotNull(result); } @RunsInCurrentThread private static void checkPositionInBounds(@Nonnull JScrollBar scrollBar, int position) { int min = scrollBar.getMinimum(); int max = scrollBar.getMaximum(); if (position >= min && position <= max) { return; } throw new IllegalArgumentException(concat("Position <", position, "> is not within the JScrollBar bounds of <", min, "> and <", max, ">")); } @RunsInCurrentThread private static @Nonnull GenericRange scrollInfo(@Nonnull JScrollBar scrollBar, @Nonnull JScrollBarLocation location, int position) { Point from = location.thumbLocation(scrollBar, scrollBar.getValue()); Point to = location.thumbLocation(scrollBar, position); return new GenericRange(from, to); } private void scroll(@Nonnull JScrollBar scrollBar, int position, @Nonnull GenericRange points) { simulateScrolling(scrollBar, points); setValueProperty(scrollBar, position); } @RunsInEDT private void simulateScrolling(@Nonnull JScrollBar scrollBar, @Nonnull GenericRange points) { robot.moveMouse(scrollBar, points.from()); robot.moveMouse(scrollBar, points.to()); } @RunsInEDT private void setValueProperty(@Nonnull JScrollBar scrollBar, int value) { setValue(scrollBar, value); robot.waitForIdle(); } /** * Asserts that the value of the {@code JScrollBar} is equal to the given one. * * @param scrollBar the target {@code JScrollBar}. * @param value the expected value. * @throws AssertionError if the value of the {@code JScrollBar} is not equal to the given one. */ @RunsInEDT public void requireValue(@Nonnull JScrollBar scrollBar, int value) { assertThat(valueOf(scrollBar)).as(propertyName(scrollBar, VALUE_PROPERTY)).isEqualTo(value); } private @Nonnull JScrollBarLocation location() { return location; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy