15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/python2.4
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright 2008 The RE2 Authors.  All Rights Reserved.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# license that can be found in the LICENSE file.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""Unittest for the util/regexp/re2/unicode.py module."""
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import os
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import StringIO
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google3.pyglib import flags
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google3.testing.pybase import googletest
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google3.util.regexp.re2 import unicode
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_UNICODE_DIR = os.path.join(flags.FLAGS.test_srcdir, "google3", "third_party",
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            "unicode", "ucd-5.1.0")
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ConvertTest(googletest.TestCase):
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Test the conversion functions."""
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testUInt(self):
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(0x0000, unicode._UInt("0000"))
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(0x263A, unicode._UInt("263A"))
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(0x10FFFF, unicode._UInt("10FFFF"))
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(unicode.InputError, unicode._UInt, "263")
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(unicode.InputError, unicode._UInt, "263AAAA")
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(unicode.InputError, unicode._UInt, "110000")
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testURange(self):
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals([1, 2, 3], unicode._URange("0001..0003"))
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals([1], unicode._URange("0001"))
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(unicode.InputError, unicode._URange, "0001..0003..0005")
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(unicode.InputError, unicode._URange, "0003..0001")
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(unicode.InputError, unicode._URange, "0001..0001")
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testUStr(self):
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals("0x263A", unicode._UStr(0x263a))
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals("0x10FFFF", unicode._UStr(0x10FFFF))
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(unicode.InputError, unicode._UStr, 0x110000)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(unicode.InputError, unicode._UStr, -1)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_UNICODE_TABLE = """# Commented line, should be ignored.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# The next line is blank and should be ignored.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)0041;Capital A;Line 1
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)0061..007A;Lowercase;Line 2
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)1F00;<Greek, First>;Ignored
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)1FFE;<Greek, Last>;Line 3
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)10FFFF;Runemax;Line 4
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)0000;Zero;Line 5
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_BAD_TABLE1 = """
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)111111;Not a code point;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_BAD_TABLE2 = """
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)0000;<Zero, First>;Missing <Zero, Last>
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_BAD_TABLE3 = """
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)0010..0001;Bad range;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AbortError(Exception):
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Function should not have been called."""
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def Abort():
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  raise AbortError("Abort")
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def StringTable(s, n, f):
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unicode.ReadUnicodeTable(StringIO.StringIO(s), n, f)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ReadUnicodeTableTest(googletest.TestCase):
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Test the ReadUnicodeTable function."""
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSimpleTable(self):
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ncall = [0]  # can't assign to ordinary int in DoLine
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def DoLine(codes, fields):
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEquals(3, len(fields))
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ncall[0] += 1
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEquals("Line %d" % (ncall[0],), fields[2])
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ncall[0] == 1:
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertEquals([0x0041], codes)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertEquals("0041", fields[0])
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertEquals("Capital A", fields[1])
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      elif ncall[0] == 2:
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertEquals(range(0x0061, 0x007A + 1), codes)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertEquals("0061..007A", fields[0])
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertEquals("Lowercase", fields[1])
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      elif ncall[0] == 3:
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertEquals(range(0x1F00, 0x1FFE + 1), codes)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertEquals("1F00..1FFE", fields[0])
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertEquals("Greek", fields[1])
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      elif ncall[0] == 4:
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertEquals([0x10FFFF], codes)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertEquals("10FFFF", fields[0])
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertEquals("Runemax", fields[1])
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      elif ncall[0] == 5:
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertEquals([0x0000], codes)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertEquals("0000", fields[0])
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertEquals("Zero", fields[1])
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StringTable(_UNICODE_TABLE, 3, DoLine)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(5, ncall[0])
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testErrorTables(self):
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(unicode.InputError, StringTable, _UNICODE_TABLE, 4, Abort)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(unicode.InputError, StringTable, _UNICODE_TABLE, 2, Abort)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(unicode.InputError, StringTable, _BAD_TABLE1, 3, Abort)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(unicode.InputError, StringTable, _BAD_TABLE2, 3, Abort)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(unicode.InputError, StringTable, _BAD_TABLE3, 3, Abort)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ParseContinueTest(googletest.TestCase):
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Test the ParseContinue function."""
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testParseContinue(self):
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(("Private Use", "First"),
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      unicode._ParseContinue("<Private Use, First>"))
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(("Private Use", "Last"),
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      unicode._ParseContinue("<Private Use, Last>"))
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(("<Private Use, Blah>", None),
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      unicode._ParseContinue("<Private Use, Blah>"))
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CaseGroupsTest(googletest.TestCase):
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Test the CaseGroups function (and the CaseFoldingReader)."""
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def FindGroup(self, c):
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if type(c) == str:
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c = ord(c)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for g in self.groups:
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if c in g:
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return g
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return None
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCaseGroups(self):
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.groups = unicode.CaseGroups(unicode_dir=_UNICODE_DIR)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals([ord("A"), ord("a")], self.FindGroup("a"))
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(None, self.FindGroup("0"))
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScriptsTest(googletest.TestCase):
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Test the Scripts function (and the ScriptsReader)."""
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def FindScript(self, c):
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if type(c) == str:
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c = ord(c)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for script, codes in self.scripts.items():
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for code in codes:
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if c == code:
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return script
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return None
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testScripts(self):
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.scripts = unicode.Scripts(unicode_dir=_UNICODE_DIR)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals("Latin", self.FindScript("a"))
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals("Common", self.FindScript("0"))
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(None, self.FindScript(0xFFFE))
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CategoriesTest(googletest.TestCase):
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Test the Categories function (and the UnicodeDataReader)."""
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def FindCategory(self, c):
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if type(c) == str:
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c = ord(c)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    short = None
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for category, codes in self.categories.items():
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for code in codes:
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if code == c:
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          # prefer category Nd over N
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if len(category) > 1:
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return category
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if short == None:
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            short = category
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return short
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCategories(self):
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.categories = unicode.Categories(unicode_dir=_UNICODE_DIR)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals("Ll", self.FindCategory("a"))
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals("Nd", self.FindCategory("0"))
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals("Lo", self.FindCategory(0xAD00))  # in First, Last range
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(None, self.FindCategory(0xFFFE))
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals("Lo", self.FindCategory(0x8B5A))
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals("Lo", self.FindCategory(0x6C38))
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals("Lo", self.FindCategory(0x92D2))
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(ord("a") in self.categories["L"])
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(ord("0") in self.categories["N"])
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(0x8B5A in self.categories["L"])
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(0x6C38 in self.categories["L"])
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(0x92D2 in self.categories["L"])
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def main():
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  googletest.main()
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == "__main__":
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  main()
208