package com.github.sommeri.less4j.compiler;
import java.io.File;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import org.junit.runners.Parameterized.Parameters;
import com.github.sommeri.less4j.AbstractFileBasedTest;
import com.github.sommeri.less4j.LessCompiler.Configuration;
import com.github.sommeri.less4j.LessFunction;
import com.github.sommeri.less4j.LessProblems;
import com.github.sommeri.less4j.core.ast.CssString;
import com.github.sommeri.less4j.core.ast.Expression;
import com.github.sommeri.less4j.core.ast.FunctionExpression;
import com.github.sommeri.less4j.core.ast.IdentifierExpression;
public class CustomLessFunctionsTest extends AbstractFileBasedTest {
private static final String standardCases = "src/test/resources/compile-basic-features/customfunc/";
public CustomLessFunctionsTest(File inputFile, File outputFile, File errorList, File mapdataFile, File configFile, String testName) {
super(inputFile, outputFile, errorList, mapdataFile, configFile, testName);
}
@Override
protected Configuration createConfiguration(File cssOutput) {
Configuration configuration = super.createConfiguration(cssOutput);
configuration.addCustomFunction(new NoParametersTestFnc());
configuration.addCustomFunctions(Arrays.asList(new MultipleParametersTestFnc(), new CauseWarningTestFnc()));
return configuration;
}
@Parameters(name="Less: {5}")
public static Collection<Object[]> allTestsParameters() {
return createTestFileUtils().loadTestFiles(standardCases);
}
}
class NoParametersTestFnc implements LessFunction {
@Override
public boolean canEvaluate(FunctionExpression input, List<Expression> parameters) {
return input.getName().equals("worksWithNone") && parameters.isEmpty();
}
@Override
public Expression evaluate(FunctionExpression input, List<Expression> parameters, Expression evaluatedParameter, LessProblems problems) {
return new IdentifierExpression(input.getUnderlyingStructure(), "worked");
}
}
class MultipleParametersTestFnc implements LessFunction {
@Override
public boolean canEvaluate(FunctionExpression input, List<Expression> parameters) {
return input.getName().equals("worksWithMultiple");
}
@Override
public Expression evaluate(FunctionExpression input, List<Expression> parameters, Expression evaluatedParameter, LessProblems problems) {
return new CssString(input.getUnderlyingStructure(), "tr", "\"");
}
}
class CauseWarningTestFnc implements LessFunction {
@Override
public boolean canEvaluate(FunctionExpression input, List<Expression> parameters) {
return input.getName().equals("warning");
}
@Override
public Expression evaluate(FunctionExpression input, List<Expression> parameters, Expression evaluatedParameter, LessProblems problems) {
problems.addWarning(evaluatedParameter, "With custom error node.");
problems.addWarning(null, "Null error node.");
return new IdentifierExpression(input.getUnderlyingStructure(), "caused");
}
}