package me.tomassetti.turin.resolvers; import com.google.common.collect.ImmutableList; import me.tomassetti.turin.definitions.TypeDefinition; import me.tomassetti.turin.parser.Parser; import me.tomassetti.turin.resolvers.jdk.JdkTypeResolver; import me.tomassetti.turin.parser.ast.*; import me.tomassetti.turin.parser.ast.properties.PropertyDefinition; import me.tomassetti.turin.parser.ast.properties.PropertyReference; import me.tomassetti.turin.typesystem.TypeUsage; import org.easymock.EasyMock; import org.easymock.EasyMockSupport; import org.junit.Test; import java.io.IOException; import java.util.Optional; import static org.junit.Assert.assertEquals; public class SrcSymbolResolverTest extends EasyMockSupport { @Test public void findDefinitionPositiveCase() throws IOException { TurinFile turinFile = new Parser().parse(this.getClass().getResourceAsStream("/basicManga.to")); SrcSymbolResolver srcSymbolResolver = new SrcSymbolResolver(ImmutableList.of(turinFile)); PropertyReference propertyReference = createMock(PropertyReference.class); EasyMock.expect(propertyReference.contextName()).andReturn("manga"); EasyMock.expect(propertyReference.getName()).andReturn("name"); replayAll(); SymbolResolver symbolResolver = new InFileSymbolResolver(JdkTypeResolver.getInstance()); ResolverRegistry.INSTANCE.record(turinFile, symbolResolver); Optional<PropertyDefinition> optionalDefinition = srcSymbolResolver.findDefinition(propertyReference); assertEquals(true, optionalDefinition.isPresent()); PropertyDefinition definition = optionalDefinition.get(); assertEquals("name", definition.getName()); assertEquals(true, definition.getType().isReferenceTypeUsage()); assertEquals("java.lang.String", definition.getType().asReferenceTypeUsage().getQualifiedName()); } @Test public void findDefinitionNegativeCase() throws IOException { TurinFile turinFile = new Parser().parse(this.getClass().getResourceAsStream("/basicManga.to")); SrcSymbolResolver srcSymbolResolver = new SrcSymbolResolver(ImmutableList.of(turinFile)); PropertyReference propertyReference = createMock(PropertyReference.class); EasyMock.expect(propertyReference.contextName()).andReturn("not_manga"); EasyMock.expect(propertyReference.getName()).andReturn("name"); replayAll(); Optional<PropertyDefinition> optionalDefinition = srcSymbolResolver.findDefinition(propertyReference); assertEquals(false, optionalDefinition.isPresent()); } @Test public void findTypeDefinitionInPositiveCase() throws IOException { TurinFile turinFile = new Parser().parse(this.getClass().getResourceAsStream("/basicManga.to")); SrcSymbolResolver srcSymbolResolver = new SrcSymbolResolver(ImmutableList.of(turinFile)); SymbolResolver symbolResolver = new InFileSymbolResolver(JdkTypeResolver.getInstance()); Optional<TypeDefinition> typeDefinition = srcSymbolResolver.findTypeDefinitionIn("manga.MangaCharacter", NoContext.getInstance(), symbolResolver); assertEquals(true, typeDefinition.isPresent()); assertEquals("manga.MangaCharacter", typeDefinition.get().getQualifiedName()); } @Test public void findTypeDefinitionInNegativeCase() throws IOException { TurinFile turinFile = new Parser().parse(this.getClass().getResourceAsStream("/basicManga.to")); SrcSymbolResolver srcSymbolResolver = new SrcSymbolResolver(ImmutableList.of(turinFile)); SymbolResolver symbolResolver = new InFileSymbolResolver(JdkTypeResolver.getInstance()); Optional<TypeDefinition> typeDefinition = srcSymbolResolver.findTypeDefinitionIn("not_manga.MangaCharacter", NoContext.getInstance(), symbolResolver); assertEquals(false, typeDefinition.isPresent()); } @Test public void findTypeUsageInPositiveCase() throws IOException { TurinFile turinFile = new Parser().parse(this.getClass().getResourceAsStream("/basicManga.to")); SrcSymbolResolver srcSymbolResolver = new SrcSymbolResolver(ImmutableList.of(turinFile)); SymbolResolver symbolResolver = new InFileSymbolResolver(JdkTypeResolver.getInstance()); Optional<TypeUsage> typeDefinition = srcSymbolResolver.findTypeUsageIn("manga.MangaCharacter", NoContext.getInstance(), symbolResolver); assertEquals(true, typeDefinition.isPresent()); assertEquals(true, typeDefinition.get().isReferenceTypeUsage()); assertEquals("manga.MangaCharacter", typeDefinition.get().asReferenceTypeUsage().getQualifiedName()); } @Test public void findTypeUsageInNegativeCase() throws IOException { TurinFile turinFile = new Parser().parse(this.getClass().getResourceAsStream("/basicManga.to")); SrcSymbolResolver srcSymbolResolver = new SrcSymbolResolver(ImmutableList.of(turinFile)); SymbolResolver symbolResolver = new InFileSymbolResolver(JdkTypeResolver.getInstance()); Optional<TypeUsage> typeDefinition = srcSymbolResolver.findTypeUsageIn("not_manga.MangaCharacter", NoContext.getInstance(), symbolResolver); assertEquals(false, typeDefinition.isPresent()); } }