/*
 * Copyright 2016-2018 the original author or authors.
 *
 * 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.
 */

package org.joinfaces.autoconfigure;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.Set;
import java.util.stream.Stream;

import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;

class ClasspathScanUtilTest {

	@Test
	void getClasses_empty() {
		Set<Class<?>> classes = ClasspathScanUtil.getClasses(Stream.empty(), getClass().getClassLoader());

		assertThat(classes).isEmpty();
	}

	@Test
	void getClasses_notFound() {
		Set<Class<?>> classes = ClasspathScanUtil.getClasses(Stream.of("foo.Bar"), getClass().getClassLoader());

		assertThat(classes).isEmpty();
	}

	@Test
	void getClasses_one() {
		Set<Class<?>> classes = ClasspathScanUtil.getClasses(Stream.of(this.getClass().getName()), getClass().getClassLoader());

		assertThat(classes).contains(this.getClass());
	}

	@Test
	void readAnnotationClassMap() throws IOException {

		String sb = Test.class.getName() +
				"=" +
				ClasspathScanUtil.class.getName() +
				"," +
				ClasspathScanUtilTest.class.getName() +
				"\n";
		ByteArrayInputStream in = new ByteArrayInputStream(sb.getBytes(StandardCharsets.UTF_8));

		Map<Class<? extends Annotation>, Set<Class<?>>> map = ClasspathScanUtil.readAnnotationClassMap(in, this.getClass().getClassLoader());

		assertThat(map).containsKey(Test.class);

		assertThat(map.get(Test.class)).contains(ClasspathScanUtil.class, ClasspathScanUtilTest.class);
	}
}

@@ -877,16 +877,97 @@
 tream;%0A%0A
+import org.junit.jupiter.api.BeforeAll;%0Aimport org.junit.jupiter.api.BeforeEach;%0A
 import o
@@ -1680,19 +1680,19 @@
 ionClass
-Map
+Set
 () throw
@@ -1748,23 +1748,67 @@
 () +
-%0A%09%09%09%09%22=%22 +
+ %22%5Cn%22%0A%09%09%09%09+ ClasspathScanUtil.class.getName() + %22%5Cn%22
 %0A%09%09%09%09
++ 
 Clas
@@ -1812,32 +1812,36 @@
 lasspathScanUtil
+Test
 .class.getName()
@@ -1846,73 +1846,751 @@
 () +
-%0A%09%09%09%09%22,%22 +%0A%09%09%09%09ClasspathScanUtilTest.class.getName() +%0A%09%09%09%09%22
+ %22%5Cn%22;%0A%09%09ByteArrayInputStream in = new ByteArrayInputStream(sb.getBytes(StandardCharsets.UTF_8));%0A%0A%09%09Set%3CClass%3C?%3E%3E set = ClasspathScanUtil.readAnnotationClassSet(in, this.getClass().getClassLoader());%0A%0A%09%09assertThat(set).contains(Test.class, ClasspathScanUtil.class, ClasspathScanUtilTest.class);%0A%09%7D%0A%0A%09@Test%0A%09void readAnnotationClassMap() throws IOException %7B%0A%0A%09%09String sb = %22org.junit.jupiter.api.Test=org.joinfaces.autoconfigure.ClasspathScanUtil,org.joinfaces.autoconfigure.ClasspathScanUtilTest%5Cn%22;%0A%09%09sb += %22non.loadable.Annotation=org.joinfaces.autoconfigure.ClasspathScanUtil%5Cn%22;%0A%09%09sb += %22org.junit.jupiter.api.BeforeEach=%5Cn%22;%0A%09%09sb += %22org.junit.jupiter.api.BeforeAll=non.loadable.Class,org.joinfaces.autoconfigure.ClasspathScanUtil
 %5Cn%22;%0A
+%0A
 %09%09By
@@ -2861,98 +2861,357 @@
 s);%0A
-%0A%09%09assertThat(map.get(Test.class)).contains(ClasspathScanUtil.class, ClasspathScanUtilTest
+%09%09assertThat(map).containsKey(BeforeEach.class);%0A%09%09assertThat(map).containsKey(BeforeAll.class);%0A%09%09assertThat(map).hasSize(3);%0A%0A%09%09assertThat(map.get(Test.class)).contains(ClasspathScanUtil.class, ClasspathScanUtilTest.class);%0A%09%09assertThat(map.get(BeforeEach.class)).isEmpty();%0A%09%09assertThat(map.get(BeforeAll.class)).containsExactly(ClasspathScanUtil
 .cla

add more tests