package org.elixir_lang.jps;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.util.PathUtilRt;
import org.elixir_lang.jps.model.JpsElixirModuleType;
import org.elixir_lang.jps.model.JpsElixirSdkType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.JpsDummyElement;
import org.jetbrains.jps.model.JpsElement;
import org.jetbrains.jps.model.library.JpsOrderRootType;
import org.jetbrains.jps.model.library.JpsTypedLibrary;
import org.jetbrains.jps.model.library.sdk.JpsSdk;
import org.jetbrains.jps.model.module.JpsModule;
import org.jetbrains.jps.util.JpsPathUtil;
import java.io.File;
/**
* Created by zyuyou on 15/7/17.
*/
public class ElixirBuilderTest extends JpsBuildTestCase {
private static final String TEST_MODULE_NAME = "m";
public void testSimple() throws Exception{
doSingleFileTest("lib/simple.ex", "defmodule Simple do def foo() do :ok end end", "Elixir.Simple.beam");
}
@Override
protected JpsSdk<JpsDummyElement> addJdk(String name, String path) {
String sdkHome = sdkHome();
String elixirVersion = elixirVersion();
JpsTypedLibrary<JpsSdk<JpsDummyElement>> jdk = myModel
.getGlobal()
.addSdk("Elixir: " + elixirVersion, sdkHome, elixirVersion, JpsElixirSdkType.INSTANCE);
jdk.addRoot(JpsPathUtil.pathToUrl(sdkHome), JpsOrderRootType.COMPILED);
return jdk.getProperties();
}
@Override
protected <T extends JpsElement> JpsModule addModule(String moduleName,
String[] srcPaths,
@Nullable String outputPath,
@Nullable String testOutputPath,
JpsSdk<T> sdk) {
return super.addModule(moduleName, srcPaths, outputPath, testOutputPath, sdk, JpsElixirModuleType.INSTANCE);
}
@NotNull
private static String sdkHome(){
return sdkHomeFromEbinDirectory(ebinDirectory());
}
@NotNull
private static String ebinDirectory() {
String ebinDirectory = System.getenv("ELIXIR_EBIN_DIRECTORY");
assertNotNull("ELIXIR_EBIN_DIRECTORY is not set", ebinDirectory);
return ebinDirectory;
}
@NotNull
private static String sdkHomeFromEbinDirectory(@NotNull String ebinDirectory) {
return new File(ebinDirectory)
.getParentFile()
.getParentFile()
.getParentFile()
.toString();
}
private void doSingleFileTest(String relativePath, String text, String expectedOutputFileName){
String depFile = createFile(relativePath, text);
addModule(TEST_MODULE_NAME, PathUtilRt.getParentPath(depFile));
rebuildAll();
assertCompiled(TEST_MODULE_NAME, expectedOutputFileName);
}
private void assertCompiled(@NotNull String moduleName, @NotNull String fileName){
String absolutePath = getAbsolutePath("out/production/" + moduleName);
assertNotNull(FileUtil.findFileInProvidedPath(absolutePath, fileName));
}
private static String elixirVersion() {
String elixirVersion = System.getenv("ELIXIR_VERSION");
assertNotNull("ELIXIR_VERSION is not set", elixirVersion);
return elixirVersion;
}
}