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

io.codearte.accurest.TestGenerator.groovy Maven / Gradle / Ivy

package io.codearte.accurest
import groovy.transform.PackageScope
import io.codearte.accurest.config.AccurestConfigProperties
import org.apache.commons.io.FilenameUtils
import org.codehaus.plexus.util.DirectoryScanner

import java.util.concurrent.atomic.AtomicInteger

import static io.codearte.accurest.util.NamesUtil.afterLast
/**
 * @author Jakub Kubrynski
 */
class TestGenerator {

	private final AccurestConfigProperties configProperties
	private AtomicInteger counter = new AtomicInteger()
	private SingleTestGenerator generator
	private FileSaver saver
	private DirectoryScanner directoryScanner

	TestGenerator(AccurestConfigProperties accurestConfigProperties) {
		this(accurestConfigProperties, new SingleTestGenerator(accurestConfigProperties),
				new FileSaver(accurestConfigProperties.generatedTestSourcesDir, accurestConfigProperties.targetFramework))
	}

	TestGenerator(AccurestConfigProperties configProperties, SingleTestGenerator generator, FileSaver saver) {
		this.configProperties = configProperties
		if (configProperties.contractsDslDir == null) {
			throw new AccurestException("Stubs directory not found under " + configProperties.contractsDslDir)
		}
		this.generator = generator
		this.saver = saver
		this.directoryScanner = new DirectoryScanner()
		directoryScanner.setExcludes(configProperties.getIgnoredFiles() as String[])
		directoryScanner.setBasedir(configProperties.contractsDslDir)
	}

	int generate() {
		generateTestClasses(configProperties.basePackageForTests)
		return counter.get()
	}

	@PackageScope
	void generateTestClasses(final String packageName) {
		directoryScanner.scan()
		directoryScanner.getIncludedDirectories()
				.each { String includedDirectoryRelativePath ->
			processIncludedDirectory(includedDirectoryRelativePath, packageName)

		}
	}

	private void processIncludedDirectory(
			final String includedDirectoryRelativePath, final String packageNameForClass) {
		if (!includedDirectoryRelativePath.isEmpty()) {
			List filesToClass = directoryScanner.includedFiles.
					grep { String includedFile ->
						return normalizePath(includedFile).matches(normalizePath(includedDirectoryRelativePath + File.separator) + "[A-Za-z0-9]*\\.groovy")
					}
			.collect {
				return new File(configProperties.contractsDslDir, it)
			}
			if (filesToClass.size()) {
				def className = afterLast(includedDirectoryRelativePath, File.separator) + configProperties.targetFramework.classNameSuffix
				def classBytes = generator.buildClass(filesToClass, className, packageNameForClass).bytes
				saver.saveClassFile(className, packageNameForClass, classBytes)
				counter.incrementAndGet()
			}
		}
	}
    
    private String normalizePath(String path) {
        return FilenameUtils.separatorsToUnix(path)
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy