#!/usr/bin/env python
# Copyright (c) 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import glob
import unittest

from idl_lexer import IDLLexer
from idl_parser import IDLParser, ParseFile
from idl_ppapi_lexer import IDLPPAPILexer
from idl_ppapi_parser import IDLPPAPIParser

def ParseCommentTest(comment):
  comment = comment.strip()
  comments = comment.split(None, 1)
  return comments[0], comments[1]


class WebIDLParser(unittest.TestCase):
  def setUp(self):
    self.parser = IDLParser(IDLLexer(), mute_error=True)
    self.filenames = glob.glob('test_parser/*_web.idl')

  def _TestNode(self, node):
    comments = node.GetListOf('Comment')
    for comment in comments:
      check, value = ParseCommentTest(comment.GetName())
      if check == 'BUILD':
        msg = 'Expecting %s, but found %s.\n' % (value, str(node))
        self.assertEqual(value, str(node), msg)

      if check == 'ERROR':
        msg = node.GetLogLine('Expecting\n\t%s\nbut found \n\t%s\n' % (
                              value, str(node)))
        self.assertEqual(value, node.GetName(), msg)

      if check == 'PROP':
        key, expect = value.split('=')
        actual = str(node.GetProperty(key))
        msg = 'Mismatched property %s: %s vs %s.\n' % (key, expect, actual)
        self.assertEqual(expect, actual, msg)

      if check == 'TREE':
        quick = '\n'.join(node.Tree())
        lineno = node.GetProperty('LINENO')
        msg = 'Mismatched tree at line %d:\n%sVS\n%s' % (lineno, value, quick)
        self.assertEqual(value, quick, msg)

  @unittest.skip("failing ")
  def testExpectedNodes(self):
    for filename in self.filenames:
      filenode = ParseFile(self.parser, filename)
      children = filenode.GetChildren()
      self.assertTrue(len(children) > 2, 'Expecting children in %s.' %
                      filename)

      for node in filenode.GetChildren()[2:]:
        self._TestNode(node)

@unittest.skip("Not supported in Cobalt")
class PepperIDLParser(unittest.TestCase):
  def setUp(self):
    self.parser = IDLPPAPIParser(IDLPPAPILexer(), mute_error=True)
    self.filenames = glob.glob('test_parser/*_ppapi.idl')

  def _TestNode(self, filename, node):
    comments = node.GetListOf('Comment')
    for comment in comments:
      check, value = ParseCommentTest(comment.GetName())
      if check == 'BUILD':
        msg = '%s - Expecting %s, but found %s.\n' % (
            filename, value, str(node))
        self.assertEqual(value, str(node), msg)

      if check == 'ERROR':
        msg = node.GetLogLine('%s - Expecting\n\t%s\nbut found \n\t%s\n' % (
                              filename, value, str(node)))
        self.assertEqual(value, node.GetName(), msg)

      if check == 'PROP':
        key, expect = value.split('=')
        actual = str(node.GetProperty(key))
        msg = '%s - Mismatched property %s: %s vs %s.\n' % (
                              filename, key, expect, actual)
        self.assertEqual(expect, actual, msg)

      if check == 'TREE':
        quick = '\n'.join(node.Tree())
        lineno = node.GetProperty('LINENO')
        msg = '%s - Mismatched tree at line %d:\n%sVS\n%s' % (
                              filename, lineno, value, quick)
        self.assertEqual(value, quick, msg)

  def testExpectedNodes(self):
    for filename in self.filenames:
      filenode = ParseFile(self.parser, filename)
      children = filenode.GetChildren()
      self.assertTrue(len(children) > 2, 'Expecting children in %s.' %
                      filename)

      for node in filenode.GetChildren()[2:]:
        self._TestNode(filename, node)

if __name__ == '__main__':
  unittest.main(verbosity=2)

