package com.github.sommeri.less4j.resources;
import static com.github.sommeri.less4j.resources.SourceMapLinkParser.assertDoesNotLinkSourceMap;
import static com.github.sommeri.less4j.resources.SourceMapLinkParser.assertInlineSourceMap;
import static com.github.sommeri.less4j.resources.SourceMapLinkParser.assertLinksSourceMap;
import static org.junit.Assert.assertNotNull;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
import com.github.sommeri.less4j.Less4jException;
import com.github.sommeri.less4j.LessCompiler;
import com.github.sommeri.less4j.LessCompiler.CompilationResult;
import com.github.sommeri.less4j.LessCompiler.Configuration;
import com.github.sommeri.less4j.LessSource;
import com.github.sommeri.less4j.core.DefaultLessCompiler;
import com.github.sommeri.less4j.platform.Constants;
import com.github.sommeri.less4j.utils.SourceMapValidator;
import com.github.sommeri.less4j.utils.URIUtils;
public class SourceMapApiTest {
public static final String NO_IMPORT_LESS_INPUT = ".class { color: red; }";
public static final String NO_DATA_AVAILABLE_MAPDATA = "src/test/resources/source-map/api/no-location-available.mapdata";
public static final String FAKE_CSS_DATA_AVAILABLE_MAPDATA = "src/test/resources/source-map/api/fake-css-available.mapdata";
public static final String FAKE_URL_DATA_AVAILABLE_MAPDATA = "src/test/resources/source-map/api/fake-url-available.mapdata";
public static final String FAKE_CSS_RESULT_LOCATION = "src/test/resources/source-map/api/does-not-exists.css";
public static final String FAKE_CSS_RESULT_LINKED_MAP = "does-not-exists.css.map";
public static final File FAKE_CSS_RESULT_FILE = new File(FAKE_CSS_RESULT_LOCATION);
public static final String FAKE_URL_RESULT_LOCATION = "http://www.somewhere.com/dummy.html#here?parameter=value";
public static final String FAKE_URL_RESULT_CSS = "dummy.html";
public static final String FAKE_URL_RESULT_LINKED_MAP = "dummy.html.map";
public static final URL FAKE_URL_RESULT_URL = toUrl();
private static URL toUrl() {
try {
return new URL(FAKE_URL_RESULT_LOCATION);
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
private static final String ONE_IMPORT_LESS_PATH = "src/test/resources/source-map/api/file-import.less";
private static final File ONE_IMPORT_LESS_FILE = new File(ONE_IMPORT_LESS_PATH);
private static final String ONE_IMPORT_MAPDATA_GUESSED_CSS = "src/test/resources/source-map/api/file-import-guessed-css.mapdata";
private static final String ONE_IMPORT_MAPDATA_WITH_LESS = "src/test/resources/source-map/api/file-import-with-less.mapdata";
private static final String ONE_IMPORT_MAPDATA_NO_RELATIVIZATION = "src/test/resources/source-map/api/file-import-no-path-relativization.mapdata";
private static final String ONE_IMPORT_CSS_KNOWN_MAPDATA = "src/test/resources/source-map/api/file-import-css-location-known.mapdata";
private static final String ONE_IMPORT_URL_KNOWN_MAPDATA = "src/test/resources/source-map/api/file-import-url-location-known.mapdata";
public static final Map<String, String> LESS_INPUT_CONTENTS = new HashMap<String, String>();
static {
LESS_INPUT_CONTENTS.put(null, NO_IMPORT_LESS_INPUT);
}
@Test
public void string() throws Less4jException {
LessCompiler compiler = new DefaultLessCompiler();
CompilationResult compilationResult = compiler.compile(NO_IMPORT_LESS_INPUT);
assertNotNull(compilationResult.getCss());
assertNotNull(compilationResult.getSourceMap());
assertDoesNotLinkSourceMap(compilationResult.getCss());
SourceMapValidator validator = new SourceMapValidator(LESS_INPUT_CONTENTS);
validator.validateSourceMap(compilationResult, new File(NO_DATA_AVAILABLE_MAPDATA));
}
@Test
public void stringWithEmptyConfiguration() throws Less4jException {
LessCompiler compiler = new DefaultLessCompiler();
CompilationResult compilationResult = compiler.compile(NO_IMPORT_LESS_INPUT, new Configuration());
assertNotNull(compilationResult.getCss());
assertNotNull(compilationResult.getSourceMap());
assertDoesNotLinkSourceMap(compilationResult.getCss());
SourceMapValidator validator = new SourceMapValidator(LESS_INPUT_CONTENTS);
validator.validateSourceMap(compilationResult, new File(NO_DATA_AVAILABLE_MAPDATA));
}
@Test
public void stringWithSourceMap() throws Less4jException {
LessCompiler compiler = new DefaultLessCompiler();
Configuration options = new Configuration();
options.getSourceMapConfiguration().setInline(true);
CompilationResult compilationResult = compiler.compile(NO_IMPORT_LESS_INPUT, options);
assertNotNull(compilationResult.getCss());
assertNotNull(compilationResult.getSourceMap());
assertInlineSourceMap(compilationResult);
SourceMapValidator validator = new SourceMapValidator(LESS_INPUT_CONTENTS);
validator.validateSourceMap(compilationResult, new File(NO_DATA_AVAILABLE_MAPDATA));
}
@Test
public void stringWithConfiguration() throws Less4jException {
Configuration configuration = new Configuration();
configuration.setCssResultLocation(FAKE_CSS_RESULT_FILE);
LessCompiler compiler = new DefaultLessCompiler();
CompilationResult compilationResult = compiler.compile(NO_IMPORT_LESS_INPUT, configuration);
assertNotNull(compilationResult.getCss());
assertNotNull(compilationResult.getSourceMap());
assertLinksSourceMap(compilationResult.getCss(), FAKE_CSS_RESULT_LINKED_MAP);
SourceMapValidator validator = new SourceMapValidator(LESS_INPUT_CONTENTS);
validator.validateSourceMap(compilationResult, new File(FAKE_CSS_DATA_AVAILABLE_MAPDATA));
}
@Test
public void stringWithURLConfiguration() throws Less4jException {
Configuration configuration = new Configuration();
configuration.setCssResultLocation(new LessSource.URLSource(FAKE_URL_RESULT_URL));
LessCompiler compiler = new DefaultLessCompiler();
CompilationResult compilationResult = compiler.compile(NO_IMPORT_LESS_INPUT, configuration);
assertNotNull(compilationResult.getCss());
assertNotNull(compilationResult.getSourceMap());
assertLinksSourceMap(compilationResult.getCss(), FAKE_URL_RESULT_LINKED_MAP);
SourceMapValidator validator = new SourceMapValidator(LESS_INPUT_CONTENTS);
validator.validateSourceMap(compilationResult, new File(FAKE_URL_DATA_AVAILABLE_MAPDATA));
}
@Test
public void file() throws Less4jException {
LessCompiler compiler = new DefaultLessCompiler();
CompilationResult compilationResult = compiler.compile(ONE_IMPORT_LESS_FILE);
assertNotNull(compilationResult.getCss());
assertNotNull(compilationResult.getSourceMap());
assertLinksSourceMap(compilationResult.getCss(), toFullMapSuffix());
SourceMapValidator validator = new SourceMapValidator(LESS_INPUT_CONTENTS);
validator.validateSourceMap(compilationResult, new File(ONE_IMPORT_MAPDATA_GUESSED_CSS), URIUtils.changeSuffix(ONE_IMPORT_LESS_FILE, Constants.FULL_SOURCE_MAP_SUFFIX));
}
@Test
public void fileWithEmptyConfiguration() throws Less4jException {
LessCompiler compiler = new DefaultLessCompiler();
CompilationResult compilationResult = compiler.compile(ONE_IMPORT_LESS_FILE, new Configuration());
assertNotNull(compilationResult.getCss());
assertNotNull(compilationResult.getSourceMap());
assertLinksSourceMap(compilationResult.getCss(), toFullMapSuffix());
SourceMapValidator validator = new SourceMapValidator(LESS_INPUT_CONTENTS);
validator.validateSourceMap(compilationResult, new File(ONE_IMPORT_MAPDATA_GUESSED_CSS), URIUtils.changeSuffix(ONE_IMPORT_LESS_FILE, Constants.CSS_SUFFIX));
}
@Test
public void fileDoNotRelativize() throws Less4jException {
LessCompiler compiler = new DefaultLessCompiler();
Configuration configuration = new Configuration();
configuration.getSourceMapConfiguration().setRelativizePaths(false);
CompilationResult compilationResult = compiler.compile(ONE_IMPORT_LESS_FILE, configuration);
assertNotNull(compilationResult.getCss());
assertNotNull(compilationResult.getSourceMap());
assertLinksSourceMap(compilationResult.getCss(), toFullMapSuffix());
SourceMapValidator validator = new SourceMapValidator("");
validator.validateSourceMap(compilationResult, new File(ONE_IMPORT_MAPDATA_NO_RELATIVIZATION), URIUtils.changeSuffix(ONE_IMPORT_LESS_FILE, Constants.CSS_SUFFIX));
}
@Test
public void fileIncludeLessFiles() throws Less4jException {
LessCompiler compiler = new DefaultLessCompiler();
Configuration configuration = new Configuration();
configuration.getSourceMapConfiguration().setIncludeSourcesContent(true);
CompilationResult compilationResult = compiler.compile(ONE_IMPORT_LESS_FILE, configuration);
assertNotNull(compilationResult.getCss());
assertNotNull(compilationResult.getSourceMap());
assertLinksSourceMap(compilationResult.getCss(), toFullMapSuffix());
SourceMapValidator validator = new SourceMapValidator(LESS_INPUT_CONTENTS);
validator.validateSourceMap(compilationResult, new File(ONE_IMPORT_MAPDATA_WITH_LESS), URIUtils.changeSuffix(ONE_IMPORT_LESS_FILE, Constants.CSS_SUFFIX));
}
@Test
public void fileSelfContained() throws Less4jException {
LessCompiler compiler = new DefaultLessCompiler();
Configuration configuration = new Configuration();
configuration.getSourceMapConfiguration().setIncludeSourcesContent(true);
configuration.getSourceMapConfiguration().setInline(true);
CompilationResult compilationResult = compiler.compile(ONE_IMPORT_LESS_FILE, configuration);
assertNotNull(compilationResult.getCss());
assertNotNull(compilationResult.getSourceMap());
assertInlineSourceMap(compilationResult);
SourceMapValidator validator = new SourceMapValidator(LESS_INPUT_CONTENTS);
validator.validateSourceMap(compilationResult, new File(ONE_IMPORT_MAPDATA_WITH_LESS), URIUtils.changeSuffix(ONE_IMPORT_LESS_FILE, Constants.CSS_SUFFIX));
}
@Test
public void fileWithConfiguration() throws Less4jException {
Configuration configuration = new Configuration();
configuration.setCssResultLocation(new File(FAKE_CSS_RESULT_LOCATION));
LessCompiler compiler = new DefaultLessCompiler();
CompilationResult compilationResult = compiler.compile(ONE_IMPORT_LESS_FILE, configuration);
assertNotNull(compilationResult.getCss());
assertNotNull(compilationResult.getSourceMap());
assertLinksSourceMap(compilationResult.getCss(), FAKE_CSS_RESULT_LINKED_MAP);
SourceMapValidator validator = new SourceMapValidator(LESS_INPUT_CONTENTS);
validator.validateSourceMap(compilationResult, new File(ONE_IMPORT_CSS_KNOWN_MAPDATA), FAKE_CSS_RESULT_FILE);
}
@Test
public void fileWithUrlConfiguration() throws Less4jException {
Configuration configuration = new Configuration();
configuration.setCssResultLocation(new LessSource.URLSource(FAKE_URL_RESULT_URL));
LessCompiler compiler = new DefaultLessCompiler();
CompilationResult compilationResult = compiler.compile(ONE_IMPORT_LESS_FILE, configuration);
assertNotNull(compilationResult.getCss());
assertNotNull(compilationResult.getSourceMap());
assertLinksSourceMap(compilationResult.getCss(), FAKE_URL_RESULT_LINKED_MAP);
SourceMapValidator validator = new SourceMapValidator(LESS_INPUT_CONTENTS);
validator.validateSourceMap(compilationResult, new File(ONE_IMPORT_URL_KNOWN_MAPDATA));
}
private String toFullMapSuffix() {
return URIUtils.changeSuffix(ONE_IMPORT_LESS_FILE.getName(), Constants.FULL_SOURCE_MAP_SUFFIX);
}
}