/*
* ******************************************************************************
* MontiCore Language Workbench
* Copyright (c) 2015, MontiCore, All rights reserved.
*
* This project is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3.0 of the License, or (at your option) any later version.
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this project. If not, see <http://www.gnu.org/licenses/>.
* ******************************************************************************
*/
package de.monticore.symboltable;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import java.util.Set;
import com.google.common.collect.Sets;
import de.monticore.symboltable.mocks.languages.entity.EntitySymbol;
import de.monticore.symboltable.mocks.languages.entity.PropertySymbol;
import de.monticore.symboltable.modifiers.AccessModifier;
import de.monticore.symboltable.modifiers.BasicAccessModifier;
import de.monticore.symboltable.resolving.CommonResolvingFilter;
import de.monticore.symboltable.resolving.ResolvingFilter;
import de.monticore.symboltable.types.JTypeSymbol;
import de.monticore.symboltable.types.references.CommonJTypeReference;
import de.monticore.symboltable.types.references.JTypeReference;
import org.junit.Test;
/**
*
* @author Pedram Mir Seyed Nazari
*/
public class ModifierTest {
@Test
public void test() {
EntitySymbol entity = new EntitySymbol("Entity");
final JTypeReference<JTypeSymbol> intReference = new CommonJTypeReference<>("int", JTypeSymbol.KIND, entity.getSpannedScope());
PropertySymbol publicI = new PropertySymbol("i", intReference);
publicI.setAccessModifier(BasicAccessModifier.PUBLIC);
PropertySymbol protectedJ = new PropertySymbol("j", intReference);
protectedJ.setAccessModifier(BasicAccessModifier.PROTECTED);
PropertySymbol defaultK = new PropertySymbol("k", intReference);
defaultK.setAccessModifier(BasicAccessModifier.PACKAGE_LOCAL);
PropertySymbol privateL = new PropertySymbol("l", intReference);
privateL.setAccessModifier(BasicAccessModifier.PRIVATE);
entity.addProperty(publicI);
entity.addProperty(protectedJ);
entity.addProperty(defaultK);
entity.addProperty(privateL);
MutableScope scope = entity.getMutableSpannedScope();
Set<ResolvingFilter<? extends Symbol>> resolvingFilters = Sets.newLinkedHashSet();
resolvingFilters.add(CommonResolvingFilter.create(PropertySymbol.KIND));
scope.setResolvingFilters(resolvingFilters);
// public (is always found)
assertSame(publicI, scope.resolve("i", PropertySymbol.KIND, BasicAccessModifier.PUBLIC).get());
assertSame(publicI, scope.resolve("i", PropertySymbol.KIND, BasicAccessModifier.PROTECTED).get());
assertSame(publicI, scope.resolve("i", PropertySymbol.KIND, BasicAccessModifier.PACKAGE_LOCAL).get());
assertSame(publicI, scope.resolve("i", PropertySymbol.KIND, BasicAccessModifier.PRIVATE).get());
assertSame(publicI, scope.resolve("i", PropertySymbol.KIND, AccessModifier.ALL_INCLUSION).get());
// protected
assertFalse(scope.resolve("j", PropertySymbol.KIND, BasicAccessModifier.PUBLIC).isPresent());
assertSame(protectedJ, scope.resolve("j", PropertySymbol.KIND, BasicAccessModifier.PROTECTED).get());
assertSame(protectedJ, scope.resolve("j", PropertySymbol.KIND, BasicAccessModifier.PACKAGE_LOCAL).get());
assertSame(protectedJ, scope.resolve("j", PropertySymbol.KIND, BasicAccessModifier.PRIVATE).get());
assertSame(protectedJ, scope.resolve("j", PropertySymbol.KIND, AccessModifier.ALL_INCLUSION).get());
// default (package access)
assertFalse(scope.resolve("k", PropertySymbol.KIND, BasicAccessModifier.PUBLIC).isPresent());
assertFalse(scope.resolve("k", PropertySymbol.KIND, BasicAccessModifier.PROTECTED).isPresent());
assertSame(defaultK, scope.resolve("k", PropertySymbol.KIND, BasicAccessModifier.PACKAGE_LOCAL).get());
assertSame(defaultK, scope.resolve("k", PropertySymbol.KIND, BasicAccessModifier.PRIVATE).get());
assertSame(defaultK, scope.resolve("k", PropertySymbol.KIND, AccessModifier.ALL_INCLUSION).get());
// private
assertFalse(scope.resolve("l", PropertySymbol.KIND, BasicAccessModifier.PUBLIC).isPresent());
assertFalse(scope.resolve("l", PropertySymbol.KIND, BasicAccessModifier.PROTECTED).isPresent());
assertFalse(scope.resolve("l", PropertySymbol.KIND, BasicAccessModifier.PACKAGE_LOCAL).isPresent());
assertSame(privateL, scope.resolve("l", PropertySymbol.KIND, BasicAccessModifier.PRIVATE).get());
assertSame(privateL, scope.resolve("l", PropertySymbol.KIND, AccessModifier.ALL_INCLUSION).get());
}
public void test2() {
EntitySymbol entity = new EntitySymbol("Entity");
final JTypeReference<JTypeSymbol> intReference = new CommonJTypeReference<>("int", JTypeSymbol.KIND, entity.getSpannedScope());
PropertySymbol publicI = new PropertySymbol("i", intReference);
publicI.setAccessModifier(BasicAccessModifier.PUBLIC);
PropertySymbol protectedJ = new PropertySymbol("j", intReference);
protectedJ.setAccessModifier(BasicAccessModifier.PROTECTED);
PropertySymbol defaultK = new PropertySymbol("k", intReference);
defaultK.setAccessModifier(BasicAccessModifier.PACKAGE_LOCAL);
PropertySymbol privateL = new PropertySymbol("l", intReference);
privateL.setAccessModifier(BasicAccessModifier.PRIVATE);
entity.addProperty(publicI);
entity.addProperty(protectedJ);
entity.addProperty(defaultK);
entity.addProperty(privateL);
MutableScope scope = entity.getMutableSpannedScope();
Set<ResolvingFilter<? extends Symbol>> resolvingFilters = Sets.newLinkedHashSet();
resolvingFilters.add(CommonResolvingFilter.create(PropertySymbol
.KIND));
scope.setResolvingFilters(resolvingFilters);
// public (is always found)
assertSame(publicI, scope.resolve("i", PropertySymbol.KIND, BasicAccessModifier.PUBLIC).get());
assertSame(publicI, scope.resolve("i", PropertySymbol.KIND, BasicAccessModifier.PROTECTED).get());
assertSame(publicI, scope.resolve("i", PropertySymbol.KIND, BasicAccessModifier.PACKAGE_LOCAL).get());
assertSame(publicI, scope.resolve("i", PropertySymbol.KIND, BasicAccessModifier.PRIVATE).get());
assertSame(publicI, scope.resolve("i", PropertySymbol.KIND, AccessModifier.ALL_INCLUSION).get());
}
}