package com.intellij.tasks.jira.jql;

import com.intellij.openapi.diagnostic.Logger;
import com.intellij.testFramework.ParsingTestCase;
import com.intellij.testFramework.PlatformTestUtil;

import java.io.File;


/**
 * @author Mikhail Golubev
 */
public class ParsingTest extends ParsingTestCase {
  private static final Logger LOG = Logger.getInstance(ParsingTest.class);

  public ParsingTest() {
    super("psi", "jql", new JqlParserDefinition());
  }

  public void testIdentifiersParsing() throws Exception {
    doCodeTest("5b changed and 12 changed and foo\\ \\n\\t\\'\\\"\\\\bar changed and 'baz' changed and \"quux\" changed");
  }

  public void testOrOperators() throws Exception {
    doCodeTest("a = 42 or b > 42 || c < 42 | d != 42");
  }

  public void testAndOperators() throws Exception {
    doCodeTest("a = 42 and b > 42 && c < 42 & d != 42");
  }

  public void testNotOperators() throws Exception {
    doCodeTest("not a = 42 and ! b > 42");
  }

  public void testListParsing() throws Exception {
    doCodeTest("field in (1, \"2\", func1(), (3, func2()))");
  }

  public void testSimpleComparisons() throws Exception {
    doCodeTest("a1 < 42 or a2 <= 42 and " +
               "b1 > 42 or b2 >= 42 and " +
               "c1 ~ \"ham\" or c1 !~ 'spam' and " +
               "d1 = 'green' or d2 != \"green\"");
  }

  public void testIsClause() throws Exception {
    doCodeTest("a1 is empty or a2 is null or a3 is not empty or a4 is not null");
  }

  public void testSubclauses() throws Exception {
    doCodeTest("(a = foo or (b > 12 and ((c < 40)))) and d ~ 'foo'");
  }

  public void testWasClause() throws Exception {
    doCodeTest("status was in (open, 'closed', \"resolved\") during (\"-3d\", -1d) by Mark");
  }

  public void testChangedClause() throws Exception {
    doCodeTest("status changed from reported to resolved by Bob on '2012-11-15'");
  }

  public void testOrderByStatement() throws Exception {
    doCodeTest("assignee = John order by duedate desc, reported, votes asc");
  }

  public void testEmptyQuery() throws Exception {
    doCodeTest("");
  }

  @Override
  protected boolean includeRanges() {
    return true;
  }

  @Override
  protected String getTestDataPath() {
    // trailing slash will be inserted in superclass constructor
    return PlatformTestUtil.getCommunityPath().replace(File.separatorChar, '/') + "/plugins/tasks/tasks-tests/testData/jira/jql";
  }
}
