All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.theangrydev.singletonenforcer.SingletonEnforcer Maven / Gradle / Ivy

There is a newer version: 2.1.0
Show newest version
/*
 * Copyright 2016 Liam Williams .
 *
 * This file is part of singleton-enforcer.
 *
 * 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 io.github.theangrydev.singletonenforcer;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;

import static java.lang.String.format;
import static org.junit.Assert.fail;

public class SingletonEnforcer {

    private final ConstructionCounter constructionCounter;

    public SingletonEnforcer(String packageToCover) {
        constructionCounter = new ConstructionCounter(packageToCover);
    }

    public void setUp() {
        constructionCounter.listenForConstructions();
    }

    public void tearDown() {
        constructionCounter.stopListeningForConstructions();
    }

    public void checkSingletonsAreConstructedOnce(Class... singletons) {
        checkSingletonsAreConstructedOnce(Arrays.asList(singletons));
    }

    public void checkSingletonsAreConstructedOnce(List> singletons) {
        Set> classesConstructedMoreThanOnce = constructionCounter.classesConstructedMoreThanOnce();

        List> notSingletons = new ArrayList<>();
        notSingletons.addAll(singletons);
        notSingletons.retainAll(classesConstructedMoreThanOnce);

        if (!notSingletons.isEmpty()) {
            fail(format("The following singletons were constructed more than once: %s", singletons));
        }
    }

    public void checkDependencyIsNotLeaked(Class singleton, Class typeOfDependencyThatShouldNotBeLeaked) {
        List> leakedTo = constructionCounter.dependencyUsageOutsideOf(singleton, typeOfDependencyThatShouldNotBeLeaked);
        if (!leakedTo.isEmpty()) {
            fail(format("The dependency '%s' of '%s' was leaked to: %s", typeOfDependencyThatShouldNotBeLeaked, singleton, leakedTo));
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy