blob: a816d38a7a86f7bb3eb313f265304573516f16a3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 University of Illinois at Urbana-Champaign and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* UIUC - Initial API and implementation
*******************************************************************************/
package org.eclipse.photran.internal.tests.parser;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.photran.internal.core.lexer.Token;
import org.eclipse.photran.internal.core.lexer.sourceform.UnpreprocessedFixedSourceForm;
import org.eclipse.photran.internal.core.lexer.sourceform.UnpreprocessedFreeSourceForm;
import org.eclipse.photran.internal.core.parser.ASTExecutableProgramNode;
import org.eclipse.photran.internal.core.parser.GenericASTVisitor;
import org.eclipse.photran.internal.tests.PhotranTestCase;
/**
* Unit tests for {@link Token#getOpenMPComments()}.
*
* @author Jeff Overbey
*/
public class TestOpenMPComments extends PhotranTestCase
{
public void testFreeFormOpenMPComments() throws Exception
{
ASTExecutableProgramNode ast = parse(// 1 1 2 2 3 3
//----5----0----5----0----5----0----5
"! This is a sample OpenMP program\n" + // Starts at offset 0
"program OpenMP\n" + // 34
" integer :: num_threads, id\n" + // 49
" !$omp parallel private(num_threads, id) \n" + // 80
" id = omp_get_thread_num()\n" +
" print *, 'This is thread ', id\n" +
" if (id == 0) then\n" +
" num_threads = omp_get_num_threads()\n" +
" print *, 'Total threads: ', num_threads\n" +
" end if\n" +
" !$omp end parallel\n" +
"end program\n",
new UnpreprocessedFreeSourceForm());
//System.out.println(ast);
List<Token> comments = OpenMPCommentVisitor.getOpenMPCommentsIn(ast);
assertEquals(2, comments.size());
Token directive = comments.get(0);
assertEquals(4, directive.getLine());
assertEquals(84, directive.getFileOffset());
assertEquals(84, directive.getStreamOffset());
assertEquals("!$omp parallel private(num_threads, id)".length(), directive.getLength());
assertEquals("!$omp ", directive.getWhiteBefore());
assertEquals("parallel private(num_threads, id)", directive.getText());
assertEquals(" \n", directive.getWhiteAfter());
directive = comments.get(1);
assertEquals(11, directive.getLine());
assertEquals(315, directive.getFileOffset());
assertEquals("end parallel", directive.getText());
}
public void testFixedFormOpenMPComments() throws Exception
{
ASTExecutableProgramNode ast = parse(// 1 1 2 2 3 3
//----5----0----5----0----5----0----5
"! This is a sample OpenMP program\n" + // Starts at offset 0
" program OpenMP\n" + // 34
" integer :: num_threads, id\n" + // 56
"c$omp parallel private(num_threads, id)\n" + // 90
" id = omp_get_thread_num()\n" +
" print *, 'This is thread ', id\n" +
" if (id .eq. 0) then\n" +
" num_threads = omp_get_num_threads()\n" +
" print *, 'Total threads: ', num_threads\n" +
" end if\n" +
"c$omp end parallel\n" +
" end program\n",
new UnpreprocessedFixedSourceForm());
//System.out.println(ast);
List<Token> comments = OpenMPCommentVisitor.getOpenMPCommentsIn(ast);
assertEquals(2, comments.size());
Token directive = comments.get(0);
assertEquals(4, directive.getLine());
assertEquals(90, directive.getFileOffset());
assertEquals(90, directive.getStreamOffset());
assertEquals("c$omp parallel private(num_threads, id)".length(), directive.getLength());
assertEquals("c$omp ", directive.getWhiteBefore());
assertEquals("parallel private(num_threads, id)", directive.getText());
assertEquals("\n", directive.getWhiteAfter());
directive = comments.get(1);
assertEquals(11, directive.getLine());
assertEquals(341, directive.getFileOffset());
assertEquals("end parallel", directive.getText());
}
public static final class OpenMPCommentVisitor extends GenericASTVisitor
{
public static List<Token> getOpenMPCommentsIn(ASTExecutableProgramNode ast)
{
OpenMPCommentVisitor visitor = new OpenMPCommentVisitor();
ast.accept(visitor);
return visitor.ompComments;
}
private List<Token> ompComments = new ArrayList<Token>();
@Override
public void visitToken(Token token)
{
ompComments.addAll(token.getOpenMPComments());
}
}
}