Алгоритмы, представляемые здесь, кажется, мне делают больше вычислений, чем я думаю, необходимы. Я не протестировал это, но я думаю, что это работало бы:
Первоначально, отметьте все пиксели, как освещенный.
Для каждого пикселя на краю карты: Как предложенное Паукообразное насекомое, используйте Bresenham для трассировки строки от пикселя до света. Если та строка ударяет, что преграда тогда отмечает все пиксели от края до только вне преграды, как являющейся в тени.
Самый простой (по крайней мере, требуемый объем нового кода) способ сделать это - запустить тест как параметризованный (пометьте @RunWith (Parameterized.class)
и добавьте метод для предоставления 10 пустых параметров). Таким образом, фреймворк будет запускать тест 10 раз.
Этот тест должен быть единственным тестом в классе, или, лучше сказать, все методы тестирования должны быть выполнены 10 раз в классе.
Вот пример:
@RunWith(Parameterized.class)
public class RunTenTimes {
@Parameterized.Parameters
public static Object[][] data() {
return new Object[10][0];
}
public RunTenTimes() {
}
@Test
public void runsTenTimes() {
System.out.println("run");
}
}
С вышеупомянутым можно даже сделать это с помощью конструктора без параметров, но я не уверен, предполагали ли это авторы фреймворка, или это сломается в будущем.
Если вы реализуют свой собственный бегун, тогда вы можете запустить тест 10 раз. Если вы используете сторонний раннер, то с 4.7, вы можете использовать новую аннотацию @Rule
и реализовать интерфейс MethodRule
, чтобы он принимал оператор и выполнял его 10 раз в цикле for. Текущий недостаток этого подхода заключается в том, что @Before
и @After
запускаются только один раз. Это, вероятно, изменится в следующей версии JUnit ( @Before
будет запускаться после @Rule
), но независимо от того, вы будете действовать с одним и тем же экземпляром объекта (что-то, что неверно для параметризованного
бегуна). Это предполагает, что какой бы бегун вы ни запускали класс, правильно распознает аннотации @Rule
. Это только в том случае, если он делегируется бегунам JUnit.
Если вы работаете с пользовательским бегуном, который не распознает аннотацию @Rule
, то вы действительно застряли в необходимости писать свой собственный бегун, который надлежащим образом делегирует этому бегуну и запускает его 10 раз.
Обратите внимание, что есть и другие способы решения этой проблемы (например, бегун Теорий), но все они требуют бегуна. К сожалению, JUnit в настоящее время не поддерживает уровни бегунов. Это бегун, который цепляет других бегунов.
Я обнаружил, что повторная аннотация Spring полезна для такого рода вещей:
@Repeat(value = 10)
Последняя версия (Spring Framework 4.3.11.RELEASE API) doc:
Что-то не так с:
@Test
void itWorks() {
// stuff
}
@Test
void itWorksRepeatably() {
for (int i = 0; i < 10; i++) {
itWorks();
}
}
В отличие от случая, когда вы тестируете каждый из массивов значений, вам не особенно важно, какой запуск завершился неудачно.
Нет необходимости делать в конфигурации или аннотации то, что можно делать в коде.
В библиотеке tempus-fugit есть прерывистая аннотация, которая работает с JUnit 4.7 @Rule
для повторения теста несколько раз или с @RunWith
.
Например,
@RunWith(IntermittentTestRunner.class)
public class IntermittentTestRunnerTest {
private static int testCounter = 0;
@Test
@Intermittent(repition = 99)
public void annotatedTest() {
testCounter++;
}
}
После запуска теста (с IntermittentTestRunner в @RunWith
), testCounter
будет равно 99 .