d4dd092ff5c8924d7b084c0a75432d8986559624mrate/*
d4dd092ff5c8924d7b084c0a75432d8986559624mrate * CDDL HEADER START
d4dd092ff5c8924d7b084c0a75432d8986559624mrate *
d4dd092ff5c8924d7b084c0a75432d8986559624mrate * The contents of this file are subject to the terms of the
d4dd092ff5c8924d7b084c0a75432d8986559624mrate * Common Development and Distribution License (the "License").
d4dd092ff5c8924d7b084c0a75432d8986559624mrate * You may not use this file except in compliance with the License.
d4dd092ff5c8924d7b084c0a75432d8986559624mrate *
d4dd092ff5c8924d7b084c0a75432d8986559624mrate * See LICENSE.txt included in this distribution for the specific
d4dd092ff5c8924d7b084c0a75432d8986559624mrate * language governing permissions and limitations under the License.
d4dd092ff5c8924d7b084c0a75432d8986559624mrate *
d4dd092ff5c8924d7b084c0a75432d8986559624mrate * When distributing Covered Code, include this CDDL HEADER in each
d4dd092ff5c8924d7b084c0a75432d8986559624mrate * file and include the License file at LICENSE.txt.
d4dd092ff5c8924d7b084c0a75432d8986559624mrate * If applicable, add the following below this CDDL HEADER, with the
d4dd092ff5c8924d7b084c0a75432d8986559624mrate * fields enclosed by brackets "[]" replaced with your own identifying
d4dd092ff5c8924d7b084c0a75432d8986559624mrate * information: Portions Copyright [yyyy] [name of copyright owner]
d4dd092ff5c8924d7b084c0a75432d8986559624mrate *
d4dd092ff5c8924d7b084c0a75432d8986559624mrate * CDDL HEADER END
d4dd092ff5c8924d7b084c0a75432d8986559624mrate */
d4dd092ff5c8924d7b084c0a75432d8986559624mrate
e94351dfdca192305581a6c67c7e45e3f86db967Lubos Kosco /*
e94351dfdca192305581a6c67c7e45e3f86db967Lubos Kosco * Copyright (c) 2015, 2016 Oracle and/or its affiliates. All rights reserved.
d4dd092ff5c8924d7b084c0a75432d8986559624mrate */
d4dd092ff5c8924d7b084c0a75432d8986559624mratepackage org.opensolaris.opengrok.analysis.c;
d4dd092ff5c8924d7b084c0a75432d8986559624mrate
b4a94e1e9bfb77dcba635f9e3cfd4fd4276b64ccLubos Koscoimport static org.junit.Assert.assertEquals;
b4a94e1e9bfb77dcba635f9e3cfd4fd4276b64ccLubos Koscoimport static org.junit.Assert.assertNotNull;
b4a94e1e9bfb77dcba635f9e3cfd4fd4276b64ccLubos Koscoimport static org.junit.Assert.assertNull;
b4a94e1e9bfb77dcba635f9e3cfd4fd4276b64ccLubos Koscoimport static org.junit.Assert.fail;
b4a94e1e9bfb77dcba635f9e3cfd4fd4276b64ccLubos Koscoimport static org.opensolaris.opengrok.analysis.AnalyzerGuru.string_ft_nstored_nanalyzed_norms;
b4a94e1e9bfb77dcba635f9e3cfd4fd4276b64ccLubos Kosco
d4dd092ff5c8924d7b084c0a75432d8986559624mrateimport java.io.File;
afbca4cfdb6c7468d7c07c56dc1dc5173456903bmrateimport java.io.FileInputStream;
d4dd092ff5c8924d7b084c0a75432d8986559624mrateimport java.io.IOException;
d4dd092ff5c8924d7b084c0a75432d8986559624mrateimport java.io.InputStream;
d4dd092ff5c8924d7b084c0a75432d8986559624mrateimport java.io.StringWriter;
b4a94e1e9bfb77dcba635f9e3cfd4fd4276b64ccLubos Kosco
b4a94e1e9bfb77dcba635f9e3cfd4fd4276b64ccLubos Koscoimport org.apache.lucene.document.Document;
d4dd092ff5c8924d7b084c0a75432d8986559624mrateimport org.apache.lucene.document.Field;
b4a94e1e9bfb77dcba635f9e3cfd4fd4276b64ccLubos Koscoimport org.apache.lucene.index.IndexableField;
d4dd092ff5c8924d7b084c0a75432d8986559624mrateimport org.junit.AfterClass;
d4dd092ff5c8924d7b084c0a75432d8986559624mrateimport org.junit.BeforeClass;
d4dd092ff5c8924d7b084c0a75432d8986559624mrateimport org.junit.Test;
d4dd092ff5c8924d7b084c0a75432d8986559624mrateimport org.opensolaris.opengrok.analysis.Ctags;
d4dd092ff5c8924d7b084c0a75432d8986559624mrateimport org.opensolaris.opengrok.analysis.FileAnalyzer;
d4dd092ff5c8924d7b084c0a75432d8986559624mrateimport org.opensolaris.opengrok.analysis.Scopes;
d4dd092ff5c8924d7b084c0a75432d8986559624mrateimport org.opensolaris.opengrok.analysis.Scopes.Scope;
d4dd092ff5c8924d7b084c0a75432d8986559624mrateimport org.opensolaris.opengrok.analysis.StreamSource;
d4dd092ff5c8924d7b084c0a75432d8986559624mrateimport org.opensolaris.opengrok.configuration.RuntimeEnvironment;
d4dd092ff5c8924d7b084c0a75432d8986559624mrateimport org.opensolaris.opengrok.search.QueryBuilder;
afbca4cfdb6c7468d7c07c56dc1dc5173456903bmrateimport org.opensolaris.opengrok.util.TestRepository;
d4dd092ff5c8924d7b084c0a75432d8986559624mrate
d4dd092ff5c8924d7b084c0a75432d8986559624mrate/**
d4dd092ff5c8924d7b084c0a75432d8986559624mrate *
d4dd092ff5c8924d7b084c0a75432d8986559624mrate * @author kotal
d4dd092ff5c8924d7b084c0a75432d8986559624mrate */
d4dd092ff5c8924d7b084c0a75432d8986559624mratepublic class CxxAnalyzerFactoryTest {
e94351dfdca192305581a6c67c7e45e3f86db967Lubos Kosco
d4dd092ff5c8924d7b084c0a75432d8986559624mrate FileAnalyzer analyzer;
eb1776903fd1f998009e97470a65fba8a499a0d9Lubos Kosco private final String ctagsProperty = "org.opensolaris.opengrok.analysis.Ctags";
d4dd092ff5c8924d7b084c0a75432d8986559624mrate private static Ctags ctags;
afbca4cfdb6c7468d7c07c56dc1dc5173456903bmrate private static TestRepository repository;
e94351dfdca192305581a6c67c7e45e3f86db967Lubos Kosco
d4dd092ff5c8924d7b084c0a75432d8986559624mrate public CxxAnalyzerFactoryTest() {
d4dd092ff5c8924d7b084c0a75432d8986559624mrate CxxAnalyzerFactory analFact = new CxxAnalyzerFactory();
d4dd092ff5c8924d7b084c0a75432d8986559624mrate this.analyzer = analFact.getAnalyzer();
d4dd092ff5c8924d7b084c0a75432d8986559624mrate RuntimeEnvironment env = RuntimeEnvironment.getInstance();
d4dd092ff5c8924d7b084c0a75432d8986559624mrate env.setCtags(System.getProperty(ctagsProperty, "ctags"));
d4dd092ff5c8924d7b084c0a75432d8986559624mrate if (env.validateExuberantCtags()) {
d4dd092ff5c8924d7b084c0a75432d8986559624mrate this.analyzer.setCtags(new Ctags());
d4dd092ff5c8924d7b084c0a75432d8986559624mrate }
d4dd092ff5c8924d7b084c0a75432d8986559624mrate }
e94351dfdca192305581a6c67c7e45e3f86db967Lubos Kosco
d4dd092ff5c8924d7b084c0a75432d8986559624mrate private static StreamSource getStreamSource(final String fname) {
d4dd092ff5c8924d7b084c0a75432d8986559624mrate return new StreamSource() {
d4dd092ff5c8924d7b084c0a75432d8986559624mrate @Override
d4dd092ff5c8924d7b084c0a75432d8986559624mrate public InputStream getStream() throws IOException {
afbca4cfdb6c7468d7c07c56dc1dc5173456903bmrate return new FileInputStream(fname);
d4dd092ff5c8924d7b084c0a75432d8986559624mrate }
d4dd092ff5c8924d7b084c0a75432d8986559624mrate };
d4dd092ff5c8924d7b084c0a75432d8986559624mrate }
e94351dfdca192305581a6c67c7e45e3f86db967Lubos Kosco
d4dd092ff5c8924d7b084c0a75432d8986559624mrate @BeforeClass
d4dd092ff5c8924d7b084c0a75432d8986559624mrate public static void setUpClass() throws Exception {
d4dd092ff5c8924d7b084c0a75432d8986559624mrate ctags = new Ctags();
d4dd092ff5c8924d7b084c0a75432d8986559624mrate ctags.setBinary(RuntimeEnvironment.getInstance().getCtags());
afbca4cfdb6c7468d7c07c56dc1dc5173456903bmrate
afbca4cfdb6c7468d7c07c56dc1dc5173456903bmrate repository = new TestRepository();
afbca4cfdb6c7468d7c07c56dc1dc5173456903bmrate repository.create(CxxAnalyzerFactoryTest.class.getResourceAsStream(
afbca4cfdb6c7468d7c07c56dc1dc5173456903bmrate "/org/opensolaris/opengrok/index/source.zip"));
d4dd092ff5c8924d7b084c0a75432d8986559624mrate }
d4dd092ff5c8924d7b084c0a75432d8986559624mrate
d4dd092ff5c8924d7b084c0a75432d8986559624mrate @AfterClass
e94351dfdca192305581a6c67c7e45e3f86db967Lubos Kosco public static void tearDownClass() throws Exception {
d4dd092ff5c8924d7b084c0a75432d8986559624mrate ctags.close();
d4dd092ff5c8924d7b084c0a75432d8986559624mrate ctags = null;
d4dd092ff5c8924d7b084c0a75432d8986559624mrate }
d4dd092ff5c8924d7b084c0a75432d8986559624mrate
d4dd092ff5c8924d7b084c0a75432d8986559624mrate /**
d4dd092ff5c8924d7b084c0a75432d8986559624mrate * Test of writeXref method, of class CAnalyzerFactory.
d4dd092ff5c8924d7b084c0a75432d8986559624mrate */
d4dd092ff5c8924d7b084c0a75432d8986559624mrate @Test
afbca4cfdb6c7468d7c07c56dc1dc5173456903bmrate public void testScopeAnalyzer() throws Exception {
afbca4cfdb6c7468d7c07c56dc1dc5173456903bmrate String path = repository.getSourceRoot() + "/c/sample.cxx";
afbca4cfdb6c7468d7c07c56dc1dc5173456903bmrate File f = new File(path);
afbca4cfdb6c7468d7c07c56dc1dc5173456903bmrate if (!(f.canRead() && f.isFile())) {
afbca4cfdb6c7468d7c07c56dc1dc5173456903bmrate fail("cxx testfile " + f + " not found");
afbca4cfdb6c7468d7c07c56dc1dc5173456903bmrate }
afbca4cfdb6c7468d7c07c56dc1dc5173456903bmrate
d4dd092ff5c8924d7b084c0a75432d8986559624mrate Document doc = new Document();
afbca4cfdb6c7468d7c07c56dc1dc5173456903bmrate doc.add(new Field(QueryBuilder.FULLPATH, path,
e94351dfdca192305581a6c67c7e45e3f86db967Lubos Kosco string_ft_nstored_nanalyzed_norms));
d4dd092ff5c8924d7b084c0a75432d8986559624mrate StringWriter xrefOut = new StringWriter();
d4dd092ff5c8924d7b084c0a75432d8986559624mrate analyzer.setCtags(ctags);
d4dd092ff5c8924d7b084c0a75432d8986559624mrate analyzer.setScopesEnabled(true);
afbca4cfdb6c7468d7c07c56dc1dc5173456903bmrate System.out.println(path);
e94351dfdca192305581a6c67c7e45e3f86db967Lubos Kosco
afbca4cfdb6c7468d7c07c56dc1dc5173456903bmrate analyzer.analyze(doc, getStreamSource(path), xrefOut);
e94351dfdca192305581a6c67c7e45e3f86db967Lubos Kosco
d4dd092ff5c8924d7b084c0a75432d8986559624mrate IndexableField scopesField = doc.getField(QueryBuilder.SCOPES);
d4dd092ff5c8924d7b084c0a75432d8986559624mrate assertNotNull(scopesField);
d4dd092ff5c8924d7b084c0a75432d8986559624mrate Scopes scopes = Scopes.deserialize(scopesField.binaryValue().bytes);
d4dd092ff5c8924d7b084c0a75432d8986559624mrate Scope globalScope = scopes.getScope(-1);
d4dd092ff5c8924d7b084c0a75432d8986559624mrate assertEquals(9, scopes.size());
e94351dfdca192305581a6c67c7e45e3f86db967Lubos Kosco
e94351dfdca192305581a6c67c7e45e3f86db967Lubos Kosco for (int i = 0; i < 50; ++i) {
d4dd092ff5c8924d7b084c0a75432d8986559624mrate if (i >= 11 && i <= 15) {
a48145afca0658c89beb5e9ccd4ef3aaea602476mrate assertEquals("SomeClass", scopes.getScope(i).getName());
e94351dfdca192305581a6c67c7e45e3f86db967Lubos Kosco assertEquals("SomeClass", scopes.getScope(i).getNamespace());
e94351dfdca192305581a6c67c7e45e3f86db967Lubos Kosco } else if (i >= 17 && i <= 20) {
a48145afca0658c89beb5e9ccd4ef3aaea602476mrate assertEquals("~SomeClass", scopes.getScope(i).getName());
e94351dfdca192305581a6c67c7e45e3f86db967Lubos Kosco assertEquals("SomeClass", scopes.getScope(i).getNamespace());
d4dd092ff5c8924d7b084c0a75432d8986559624mrate } else if (i >= 22 && i <= 25) {
a48145afca0658c89beb5e9ccd4ef3aaea602476mrate assertEquals("MemberFunc", scopes.getScope(i).getName());
e94351dfdca192305581a6c67c7e45e3f86db967Lubos Kosco assertEquals("SomeClass", scopes.getScope(i).getNamespace());
d4dd092ff5c8924d7b084c0a75432d8986559624mrate } else if (i >= 27 && i <= 29) {
a48145afca0658c89beb5e9ccd4ef3aaea602476mrate assertEquals("operator ++", scopes.getScope(i).getName());
e94351dfdca192305581a6c67c7e45e3f86db967Lubos Kosco assertEquals("SomeClass", scopes.getScope(i).getNamespace());
d4dd092ff5c8924d7b084c0a75432d8986559624mrate } else if (i >= 32 && i <= 34) {
a48145afca0658c89beb5e9ccd4ef3aaea602476mrate assertEquals("TemplateMember", scopes.getScope(i).getName());
e94351dfdca192305581a6c67c7e45e3f86db967Lubos Kosco assertEquals("SomeClass", scopes.getScope(i).getNamespace());
d4dd092ff5c8924d7b084c0a75432d8986559624mrate } else if (i >= 44 && i <= 46) {
a48145afca0658c89beb5e9ccd4ef3aaea602476mrate assertEquals("SomeFunc", scopes.getScope(i).getName());
e94351dfdca192305581a6c67c7e45e3f86db967Lubos Kosco assertEquals("ns1::NamespacedClass", scopes.getScope(i).getNamespace());
d4dd092ff5c8924d7b084c0a75432d8986559624mrate } else if (i >= 51 && i <= 54) {
a48145afca0658c89beb5e9ccd4ef3aaea602476mrate assertEquals("foo", scopes.getScope(i).getName());
e94351dfdca192305581a6c67c7e45e3f86db967Lubos Kosco assertNull(scopes.getScope(i).getNamespace());
d4dd092ff5c8924d7b084c0a75432d8986559624mrate } else if (i >= 59 && i <= 73) {
a48145afca0658c89beb5e9ccd4ef3aaea602476mrate assertEquals("bar", scopes.getScope(i).getName());
e94351dfdca192305581a6c67c7e45e3f86db967Lubos Kosco assertNull(scopes.getScope(i).getNamespace());
d4dd092ff5c8924d7b084c0a75432d8986559624mrate } else if (i >= 76 && i <= 87) {
a48145afca0658c89beb5e9ccd4ef3aaea602476mrate assertEquals("main", scopes.getScope(i).getName());
e94351dfdca192305581a6c67c7e45e3f86db967Lubos Kosco assertNull(scopes.getScope(i).getNamespace());
d4dd092ff5c8924d7b084c0a75432d8986559624mrate } else {
d4dd092ff5c8924d7b084c0a75432d8986559624mrate assertEquals(scopes.getScope(i), globalScope);
e94351dfdca192305581a6c67c7e45e3f86db967Lubos Kosco assertNull(scopes.getScope(i).getNamespace());
d4dd092ff5c8924d7b084c0a75432d8986559624mrate }
d4dd092ff5c8924d7b084c0a75432d8986559624mrate }
d4dd092ff5c8924d7b084c0a75432d8986559624mrate }
e94351dfdca192305581a6c67c7e45e3f86db967Lubos Kosco
d4dd092ff5c8924d7b084c0a75432d8986559624mrate}