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

io.coderate.accurest.builder.ClassBuilder.groovy Maven / Gradle / Ivy

package io.coderate.accurest.builder

import io.coderate.accurest.config.TestFramework
import io.coderate.accurest.util.NamesUtil

/**
 * @author Jakub Kubrynski
 */
class ClassBuilder {

	private final String className
	private final String packageName
	private final String baseClass
	private final List imports = []
	private final List staticImports = []
	private final List rules = []
	private final List methods = []
	private final String modifier
	private final String suffix

	private ClassBuilder(String className, String packageName, String baseClass, TestFramework lang) {
		if (baseClass) {
			imports << baseClass
		}
		this.baseClass = NamesUtil.afterLastDot(baseClass)
		this.packageName = packageName
		this.className = className
		switch (lang) {
			case TestFramework.JUNIT:
				modifier = "public "
				suffix = ";"
				break
			case TestFramework.SPOCK:
				modifier = ""
				suffix = ""
		}
	}

	static ClassBuilder createClass(String className, String packageName, TestFramework lang) {
		return createClass(className, packageName, null, lang)
	}

	static ClassBuilder createClass(String className, String packageName, String baseClass, TestFramework lang) {
		return new ClassBuilder(className, packageName, baseClass, lang)
	}

	ClassBuilder addImport(String importToAdd) {
		imports << importToAdd
		return this
	}

	ClassBuilder addStaticImport(String importToAdd) {
		staticImports << importToAdd
		return this
	}

	ClassBuilder addMethod(MethodBuilder methodBuilder) {
		methods << methodBuilder
		return this
	}

	ClassBuilder addRule(String ruleClass) {
		imports << ruleClass
		rules << NamesUtil.afterLastDot(ruleClass)
		return this
	}

	String build() {
		BlockBuilder clazz = new BlockBuilder("\t")
				.addLine("package $packageName" + suffix)
				.addEmptyLine()

		imports.sort().each {
			clazz.addLine("import $it" + suffix)
		}
		if (!imports.empty) {
			clazz.addEmptyLine()
		}

		staticImports.sort().each {
			clazz.addLine("import static $it" + suffix)
		}
		if (!staticImports.empty) {
			clazz.addEmptyLine()
		}

		def classLine = modifier + "class $className"
		if (baseClass) {
			classLine += " extends $baseClass"
		}
		clazz.addLine(classLine + ' {')
		clazz.addEmptyLine()

		clazz.startBlock()
		rules.sort().each {
			clazz.addLine("@Rule")
			clazz.addLine("public " + it + " " + NamesUtil.camelCase(it) + " = new $it()" + suffix)
		}
		clazz.endBlock()
		if (!rules.empty) {
			clazz.addEmptyLine()
		}

		methods.each {
			clazz.addBlock(it)
		}

		clazz.addLine('}')
		clazz.toString()
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy