/*
 * 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);
		}
	}
}
