package org.junit.tests.manipulation;

import static org.junit.Assert.assertTrue;

import java.util.Arrays;
import java.util.List;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.Description;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.RunWith;
import org.junit.runner.manipulation.Filter;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

public class FilterableTest {
	public static class FilteredRunner extends Parameterized {
		public FilteredRunner(Class<?> klass) throws Throwable {
			super(klass);
			filter(new Filter() {

				@Override
				public boolean shouldRun(Description description) {
					return !description.getDisplayName().contains("skip");
				}

				@Override
				public String describe() {
					return "skip methods containing the word 'skip'";
				}
			});
		}
	}

	@RunWith(FilteredRunner.class)
	public static class FilteredTest {
		@Parameters
		public static List<Object[]> parameters() {
			return Arrays.asList(new Object[] { 3 }, new Object[] { 4 });
		}

		public FilteredTest(int x) {
		}

		@Test
		public void skipThis() {
			Assert.fail();
		}

		@Test
		public void runThis() {
		}
	}

	@Test
	public void testFilterInRunnerConstructor() {
		Result result= JUnitCore.runClasses(FilteredTest.class);
		assertTrue(result.wasSuccessful());
	}
}
