/* * Copyright 2000-2013 JetBrains s.r.o. * * 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 com.intellij.psi.codeStyle.arrangement.match; import com.intellij.openapi.util.Comparing; import com.intellij.psi.codeStyle.arrangement.DefaultArrangementSettingsSerializer; import com.intellij.psi.codeStyle.arrangement.model.ArrangementAtomMatchCondition; import com.intellij.psi.codeStyle.arrangement.model.ArrangementCompositeMatchCondition; import com.intellij.psi.codeStyle.arrangement.model.ArrangementMatchCondition; import com.intellij.psi.codeStyle.arrangement.std.ArrangementSettingsToken; import com.intellij.psi.codeStyle.arrangement.std.StdArrangementTokens; import com.intellij.util.containers.ContainerUtilRt; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.junit.Test; import java.util.List; import java.util.Set; import static com.intellij.psi.codeStyle.arrangement.std.StdArrangementTokens.EntryType.*; import static com.intellij.psi.codeStyle.arrangement.std.StdArrangementTokens.Modifier.*; import static org.junit.Assert.*; /** * @author Denis Zhdanov * @since 07/18/2012 */ public class DefaultArrangementEntryMatcherSerializerTest { private final DefaultArrangementEntryMatcherSerializer mySerializer = new DefaultArrangementEntryMatcherSerializer(DefaultArrangementSettingsSerializer.Mixin.NULL); @Test public void simpleMatchers() { doTest(new ArrangementAtomMatchCondition(CLASS)); doTest(new ArrangementAtomMatchCondition(PRIVATE)); } @Test public void compositeMatchers() { ArrangementCompositeMatchCondition condition = new ArrangementCompositeMatchCondition(); condition.addOperand(new ArrangementAtomMatchCondition(METHOD)); condition.addOperand(new ArrangementAtomMatchCondition(SYNCHRONIZED)); doTest(condition); condition = new ArrangementCompositeMatchCondition(); condition.addOperand(new ArrangementAtomMatchCondition(FIELD)); condition.addOperand(new ArrangementAtomMatchCondition(PUBLIC)); condition.addOperand(new ArrangementAtomMatchCondition(STATIC)); condition.addOperand(new ArrangementAtomMatchCondition(FINAL)); } @Test public void conditionsOrder() { // Inspired by IDEA-91826. ArrangementCompositeMatchCondition condition = new ArrangementCompositeMatchCondition(); ArrangementSettingsToken typeToPreserve = FIELD; Set<ArrangementSettingsToken> modifiersToPreserve = ContainerUtilRt.newHashSet(PUBLIC, STATIC, FINAL); condition.addOperand(new ArrangementAtomMatchCondition(typeToPreserve, typeToPreserve)); for (ArrangementSettingsToken modifier : modifiersToPreserve) { condition.addOperand(new ArrangementAtomMatchCondition(modifier, modifier)); } Element element = mySerializer.serialize(new StdArrangementEntryMatcher(condition)); assertNotNull(element); // Change hash-container data distribution at the composite condition. for (ArrangementSettingsToken type : StdArrangementTokens.EntryType.values()) { if (type != typeToPreserve) { condition.addOperand(new ArrangementAtomMatchCondition(type, type)); } } for (ArrangementSettingsToken modifier : StdArrangementTokens.Modifier.values()) { if (!modifiersToPreserve.contains(modifier)) { condition.addOperand(new ArrangementAtomMatchCondition(modifier, modifier)); } } // Revert state to the initial one. for (ArrangementSettingsToken type : StdArrangementTokens.EntryType.values()) { if (type != typeToPreserve) { condition.removeOperand(new ArrangementAtomMatchCondition(type, type)); } } for (ArrangementSettingsToken modifier : StdArrangementTokens.Modifier.values()) { if (!modifiersToPreserve.contains(modifier)) { condition.removeOperand(new ArrangementAtomMatchCondition(modifier, modifier)); } } // Check that the order is the same Element actual = mySerializer.serialize(new StdArrangementEntryMatcher(condition)); assertNotNull(actual); checkElements(element, actual); } @Test public void nameConditionOnly() { ArrangementAtomMatchCondition condition = new ArrangementAtomMatchCondition(StdArrangementTokens.Regexp.NAME, "get*"); doTest(condition); } @Test public void compositeConditionWithName() { ArrangementCompositeMatchCondition condition = new ArrangementCompositeMatchCondition(); condition.addOperand(new ArrangementAtomMatchCondition(METHOD)); condition.addOperand(new ArrangementAtomMatchCondition(SYNCHRONIZED)); condition.addOperand(new ArrangementAtomMatchCondition(StdArrangementTokens.Regexp.NAME, ("get*"))); doTest(condition); } private static void checkElements(@NotNull Element expected, @NotNull Element actual) { assertTrue( String.format("Tag name mismatch - expected: '%s', actual: '%s'", expected.getName(), actual.getName()), Comparing.equal(expected.getName(), actual.getName()) ); List children1 = expected.getChildren(); List children2 = actual.getChildren(); assertEquals(children1.size(), children2.size()); if (children1.isEmpty()) { assertTrue( String.format("Content mismatch - expected: '%s', actual: '%s'", expected.getText(), actual.getText()), Comparing.equal(expected.getText(), actual.getText()) ); } else { for (int i = 0; i < children1.size(); i++) { checkElements((Element)children1.get(i), (Element)children2.get(i)); } } } private void doTest(@NotNull ArrangementMatchCondition condition) { Element element = mySerializer.serialize(new StdArrangementEntryMatcher(condition)); assertNotNull(String.format("Can't serialize match condition '%s'", condition), element); ArrangementEntryMatcher matcher = mySerializer.deserialize(element); assertNotNull(matcher); assertEquals(condition, ((StdArrangementEntryMatcher)matcher).getCondition()); } }