/* * Copyright 2015 Nokia Solutions and Networks * Licensed under the Apache License, Version 2.0, * see license.txt file for details. */ package org.rf.ide.core.testdata.mapping.testcases; import java.util.ArrayList; import java.util.List; import java.util.Stack; import org.rf.ide.core.testdata.model.FilePosition; import org.rf.ide.core.testdata.model.RobotFile; import org.rf.ide.core.testdata.model.RobotFileOutput; import org.rf.ide.core.testdata.model.table.ARobotSectionTable; import org.rf.ide.core.testdata.model.table.TableHeader; import org.rf.ide.core.testdata.model.table.TestCaseTable; import org.rf.ide.core.testdata.model.table.testcases.TestCase; import org.rf.ide.core.testdata.text.read.IRobotLineElement; import org.rf.ide.core.testdata.text.read.ParsingState; import org.rf.ide.core.testdata.text.read.RobotLine; import org.rf.ide.core.testdata.text.read.recognizer.RobotToken; import org.rf.ide.core.testdata.text.read.recognizer.RobotTokenType; public class TestCaseFinder { public TestCase findOrCreateNearestTestCase(final RobotLine currentLine, final Stack<ParsingState> processingState, final RobotFileOutput robotFileOutput, final RobotToken rt, final FilePosition fp) { final RobotFile fileModel = robotFileOutput.getFileModel(); final TestCaseTable testCaseTable = fileModel.getTestCaseTable(); TestCase testCase; final List<TestCase> lastHeaderTestCases = filterByTestCasesAfterLastHeader(testCaseTable); if (lastHeaderTestCases.isEmpty()) { testCase = createArtificialTestCase(robotFileOutput, testCaseTable); testCaseTable.addTest(testCase); final RobotLine lineToModify = findRobotLineInModel(fileModel, testCase, currentLine); lineToModify.addLineElementAt(0, testCase.getTestName()); } else { testCase = lastHeaderTestCases.get(lastHeaderTestCases.size() - 1); } return testCase; } private RobotLine findRobotLineInModel(final RobotFile fileModel, final TestCase testCase, final RobotLine currentLine) { RobotLine foundLine = currentLine; if (currentLine.getLineNumber() != testCase.getBeginPosition() .getLine()) { final List<RobotLine> fileContent = fileModel.getFileContent(); for (final RobotLine line : fileContent) { if (testCase.getBeginPosition().getLine() == line .getLineNumber()) { foundLine = line; break; } } } return foundLine; } private TestCase createArtificialTestCase(final RobotFileOutput robotFileOutput, final TestCaseTable testCaseTable) { TestCase testCase; final List<TableHeader<? extends ARobotSectionTable>> headers = testCaseTable .getHeaders(); final TableHeader<?> tableHeader = headers.get(headers.size() - 1); final RobotToken artificialNameToken = new RobotToken(); artificialNameToken.setLineNumber(tableHeader.getTableHeader() .getLineNumber() + 1); artificialNameToken.setRaw(""); artificialNameToken.setText(""); artificialNameToken.setStartColumn(0); final RobotLine robotLine = robotFileOutput.getFileModel().getFileContent() .get(tableHeader.getTableHeader().getLineNumber() - 1); final IRobotLineElement endOfLine = robotLine.getEndOfLine(); artificialNameToken.setStartOffset(endOfLine.getStartOffset() + endOfLine.getRaw().length()); artificialNameToken.setType(RobotTokenType.TEST_CASE_NAME); testCase = new TestCase(artificialNameToken); return testCase; } public List<TestCase> filterByTestCasesAfterLastHeader( final TestCaseTable testCaseTable) { final List<TestCase> testCases = new ArrayList<>(); final List<TableHeader<? extends ARobotSectionTable>> headers = testCaseTable .getHeaders(); if (!headers.isEmpty()) { final List<TestCase> testCasesAvail = testCaseTable.getTestCases(); final TableHeader<?> tableHeader = headers.get(headers.size() - 1); final int tableHeaderLineNumber = tableHeader.getTableHeader() .getLineNumber(); final int numberOfTestCases = testCasesAvail.size(); for (int i = 0; i < numberOfTestCases; i++) { final TestCase test = testCasesAvail.get(i); if (test.getTestName().getLineNumber() > tableHeaderLineNumber) { testCases.add(test); } } } return testCases; } }