blob: 6108ceda7a023e7ed2077ef34bcfd319d222b248 [file] [log] [blame]
/*
* Copyright 2015-2022 the original author or authors.
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v2.0 which
* accompanies this distribution and is available at
*
* https://www.eclipse.org/legal/epl-v20.html
*/
package org.junit.jupiter.migrationsupport.rules;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.migrationsupport.rules.FailAfterAllHelper.fail;
import java.util.ArrayList;
import java.util.List;
import org.junit.Rule;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.rules.ExternalResource;
@ExtendWith(ExternalResourceSupport.class)
public class ExternalResourceSupportForMixedMethodAndFieldRulesTests {
private static List<String> initEvents = new ArrayList<>();
private static List<String> beforeEvents = new ArrayList<>();
private static List<String> afterEvents = new ArrayList<>();
@BeforeAll
static void clear() {
initEvents.clear();
beforeEvents.clear();
afterEvents.clear();
}
@Rule
public ExternalResource fieldRule1 = new MyExternalResource("fieldRule1");
@Rule
public ExternalResource fieldRule2 = new MyExternalResource("fieldRule2");
@Rule
ExternalResource methodRule1() {
return new MyExternalResource("methodRule1");
}
@Rule
ExternalResource methodRule2() {
return new MyExternalResource("methodRule2");
}
@Test
void constructorsAndBeforeEachMethodsOfAllRulesWereExecuted() {
assertThat(initEvents).hasSize(4);
// the order of fields and methods is not stable, but fields are initialized before methods are called
assertThat(initEvents.subList(0, 2)).allMatch(item -> item.startsWith("fieldRule"));
assertThat(initEvents.subList(2, 4)).allMatch(item -> item.startsWith("methodRule"));
// beforeEach methods of rules from fields are run before those from methods but in reverse order of instantiation
assertEquals(asList(initEvents.get(1), initEvents.get(0), initEvents.get(3), initEvents.get(2)), beforeEvents);
}
@AfterAll
static void afterMethodsOfAllRulesWereExecuted() {
// beforeEach methods of rules from methods are run before those from fields but in reverse order
if (!asList(initEvents.get(2), initEvents.get(3), initEvents.get(0), initEvents.get(1)).equals(afterEvents))
fail();
}
static class MyExternalResource extends ExternalResource {
private final String name;
MyExternalResource(String name) {
this.name = name;
initEvents.add(name);
}
@Override
protected void before() {
beforeEvents.add(name);
}
@Override
protected void after() {
afterEvents.add(name);
}
}
}