import re

from .Message import *
from .AnnotationParser import AnnotationParser
from .TagsParser import TagsParser
from .Name import *

##########################################
class TestCase:
   ########################################
   def __init__(self, name, scope, file, line, annotations):
      self.traditional_name = name[0]
      self.name             = name[1]
      self.p_test           = name[2]
      if self.name != None:
         self.name = escape_name("".join(filter(lambda x : x != "\"", self.name)))
      self.scope            = scope
      self.file             = file
      self.line             = line
      annotation = None
      if len(annotations) > 0:
        annotation = annotations[0]

      self.annotations      = AnnotationParser(annotation, {"id":None, "depends":None, "memcheck":None, "data":None, "tags":[]}).parse()
      if self.p_test and self.annotations["data"] == None:
         raw_fatal(file, line, "parameterized test should have data provider")

      self.annotations['tags'] = TagsParser(self.annotations['tags']).parse()

      self.depends          = None
      self.generated        = None

   ########################################
   def get_data_provider_name(self):
      return self.annotations['data']

   ########################################
   def is_p_test(self):
      return self.p_test

   ########################################
   def get_tags(self):
      return self.annotations['tags']

   ########################################
   def get_memcheck_switch(self):
      return self.annotations['memcheck']

   ########################################
   def set_scope(self, scope):
      self.scope = scope

   ########################################
   def has_been_generated(self):
      return self.generated

   ########################################
   def mark_as_generated(self):
      self.generated = True

   ########################################
   def matches_id(self, id):
      return id != None and self.annotations["id"] == id

   ########################################
   def report_non_existing_data_provider(self):
      raw_fatal(self.file, self.line, "data provider \"" + self.get_data_provider_name() + "\" does not exist.")

   ########################################
   def report_cyclic_depend_error(self):
      raw_fatal(self.file, self.line, "cyclic depends.")


   ########################################
   def __get_depends(self):
      if self.annotations["depends"] == None:
         return None

      depends = self.scope.find_testcase_with_id(self.annotations["depends"]) 
      if depends == None:
         raw_fatal(self.file, self.line, "no testcase was specified with id=" + self.annotations["depends"])

      return depends

   ########################################
   def get_depends(self):
      if not self.depends:
         self.depends = self.__get_depends()

      return self.depends
     
   ########################################
   def show(self):
       content = "TEST(" + self.get_name() + ")"
       print(content.encode('utf-8'))

   ########################################
   def get_name(self):
      if not self.name:
         return self.traditional_name

      return self.name

   ########################################
   def get_traditional_name(self):
      return self.traditional_name

   ########################################
   def get_file_name(self):
      return self.file

   ########################################
   def get_line_number(self):
      return self.line

##########################################