/* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jetbrains.android.dom.converters; import com.intellij.psi.PsiFileFactory; import com.intellij.psi.xml.XmlDocument; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; import com.intellij.testFramework.LightIdeaTestCase; import com.intellij.util.IncorrectOperationException; import com.intellij.util.xml.ConvertContext; import com.intellij.util.xml.DomElement; import com.intellij.util.xml.DomManager; import com.intellij.util.xml.impl.ConvertContextFactory; import com.intellij.util.xml.impl.DomInvocationHandler; import com.intellij.util.xml.impl.DomManagerImpl; import org.jetbrains.android.dom.resources.StyleItem; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; public class DimensionConverterTest extends LightIdeaTestCase { public void test() { DimensionConverter converter = new DimensionConverter(); StyleItem element = createElement("<item>10dp</item>", StyleItem.class); DomInvocationHandler handler = DomManagerImpl.getDomInvocationHandler(element); assertNotNull(handler); ConvertContext context = ConvertContextFactory.createConvertContext(handler); List<String> variants = new ArrayList<String>(converter.getVariants(context)); Collections.sort(variants); assertEquals(Arrays.asList("10dp", "10in", "10mm", "10pt", "10px", "10sp"), variants); // Valid units assertEquals("1dip", converter.fromString("1dip", context)); assertEquals("1dp", converter.fromString("1dp", context)); assertEquals("1px", converter.fromString("1px", context)); assertEquals("1in", converter.fromString("1in", context)); assertEquals("1mm", converter.fromString("1mm", context)); assertEquals("1sp", converter.fromString("1sp", context)); assertEquals("1pt", converter.fromString("1pt", context)); // Invalid dimensions (missing units) assertNull(converter.fromString("not_a_dimension", context)); assertNull(converter.fromString("", context)); assertEquals("Cannot resolve symbol ''", converter.getErrorMessage("", context)); assertNull(converter.fromString("1", context)); assertEquals("Cannot resolve symbol '1'", converter.getErrorMessage("1", context)); assertNull(converter.fromString("1.5", context)); assertEquals("Cannot resolve symbol '1.5'", converter.getErrorMessage("1.5", context)); // Unknown units assertNull(converter.fromString("15d", context)); assertEquals("Unknown unit 'd'", converter.getErrorMessage("15d", context)); assertNull(converter.fromString("15wrong", context)); assertEquals("Unknown unit 'wrong'", converter.getErrorMessage("15wrong", context)); // Normal conversions assertEquals("15px", converter.fromString("15px", context)); assertEquals("15", DimensionConverter.getIntegerPrefix("15px")); assertEquals("px", DimensionConverter.getUnitFromValue("15px")); // Make sure negative numbers work assertEquals("-10px", converter.fromString("-10px", context)); assertEquals("-10", DimensionConverter.getIntegerPrefix("-10px")); assertEquals("px", DimensionConverter.getUnitFromValue("-10px")); // Make sure decimals work assertEquals("1.5sp", converter.fromString("1.5sp", context)); assertEquals("1.5", DimensionConverter.getIntegerPrefix("1.5sp")); assertEquals("sp", DimensionConverter.getUnitFromValue("1.5sp")); assertEquals(".5sp", converter.fromString(".5sp", context)); assertEquals(".5", DimensionConverter.getIntegerPrefix(".5sp")); assertEquals("sp", DimensionConverter.getUnitFromValue(".5sp")); // Make sure the right type of decimal separator is used assertNull(converter.fromString("1,5sp", context)); assertEquals("Use a dot instead of a comma as the decimal mark", converter.getErrorMessage("1,5sp", context)); // Documentation assertEquals("<html><body>" + "<b>Density-independent Pixels</b> - an abstract unit that is based on the physical density of the screen." + "</body></html>", converter.getDocumentation("1dp")); assertEquals("<html><body>" + "<b>Pixels</b> - corresponds to actual pixels on the screen. Not recommended." + "</body></html>", converter.getDocumentation("-10px")); assertEquals("<html><body>" + "<b>Scale-independent Pixels</b> - this is like the dp unit, but " + "it is also scaled by the user's font size preference." + "</body></html>", converter.getDocumentation("1.5sp")); } // Based on code in com.intellij.util.xml.impl.DomTestCase @SuppressWarnings("deprecation") protected <T extends DomElement> T createElement(final String xml, final Class<T> aClass) throws IncorrectOperationException { final DomManagerImpl domManager = (DomManagerImpl)DomManager.getDomManager(getProject()); final String name = "a.xml"; final XmlFile file = (XmlFile)PsiFileFactory.getInstance(domManager.getProject()).createFileFromText(name, xml); assertNotNull(file); XmlDocument document = file.getDocument(); assertNotNull(document); final XmlTag tag = document.getRootTag(); final String rootTagName = tag != null ? tag.getName() : "root"; final T element = domManager.getFileElement(file, aClass, rootTagName).getRootElement(); assertNotNull(element); assertSame(tag, element.getXmlTag()); return element; } }