/**
 * 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
 * <p>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * 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.apache.winegrower.extension.testing.junit5.internal.engine;

import org.junit.jupiter.api.extension.Extension;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.engine.execution.BeforeEachMethodAdapter;
import org.junit.jupiter.engine.extension.ExtensionRegistry;

import java.util.stream.Stream;

import static java.util.Optional.ofNullable;

public class CaptureExtensionRegistry implements BeforeEachMethodAdapter {
    public static final ExtensionContext.Namespace NAMESPACE = ExtensionContext.Namespace.create(CaptureExtensionRegistry.class);

    @Override
    public void invokeBeforeEachMethod(final ExtensionContext context, final ExtensionRegistry registry) {
        context.getStore(NAMESPACE).put(ExtensionRegistry.class, registry);
    }

    public static <T extends Extension> Stream<T> get(final Class<T> type, final ExtensionContext context) {
        return ofNullable(context.getStore(NAMESPACE)
                .get(ExtensionRegistry.class, ExtensionRegistry.class))
                .map(it -> it.stream(type))
                .orElseGet(Stream::empty);
    }
}
