| # Copyright 2016 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 gn_helpers | 
 | import unittest | 
 |  | 
 | class UnitTest(unittest.TestCase): | 
 |   def test_ToGNString(self): | 
 |     self.assertEqual( | 
 |         gn_helpers.ToGNString([1, 'two', [ '"thr$\\', True, False, [] ]]), | 
 |         '[ 1, "two", [ "\\"thr\\$\\\\", true, false, [  ] ] ]') | 
 |  | 
 |   def test_UnescapeGNString(self): | 
 |     # Backslash followed by a \, $, or " means the folling character without | 
 |     # the special meaning. Backslash followed by everything else is a literal. | 
 |     self.assertEqual( | 
 |         gn_helpers.UnescapeGNString('\\as\\$\\\\asd\\"'), | 
 |         '\\as$\\asd"') | 
 |  | 
 |   def test_FromGNString(self): | 
 |     self.assertEqual( | 
 |         gn_helpers.FromGNString('[1, -20, true, false,["as\\"", []]]'), | 
 |         [ 1, -20, True, False, [ 'as"', [] ] ]) | 
 |  | 
 |     with self.assertRaises(gn_helpers.GNException): | 
 |       parser = gn_helpers.GNValueParser('123 456') | 
 |       parser.Parse() | 
 |  | 
 |   def test_ParseBool(self): | 
 |     parser = gn_helpers.GNValueParser('true') | 
 |     self.assertEqual(parser.Parse(), True) | 
 |  | 
 |     parser = gn_helpers.GNValueParser('false') | 
 |     self.assertEqual(parser.Parse(), False) | 
 |  | 
 |   def test_ParseNumber(self): | 
 |     parser = gn_helpers.GNValueParser('123') | 
 |     self.assertEqual(parser.ParseNumber(), 123) | 
 |  | 
 |     with self.assertRaises(gn_helpers.GNException): | 
 |       parser = gn_helpers.GNValueParser('') | 
 |       parser.ParseNumber() | 
 |     with self.assertRaises(gn_helpers.GNException): | 
 |       parser = gn_helpers.GNValueParser('a123') | 
 |       parser.ParseNumber() | 
 |  | 
 |   def test_ParseString(self): | 
 |     parser = gn_helpers.GNValueParser('"asdf"') | 
 |     self.assertEqual(parser.ParseString(), 'asdf') | 
 |  | 
 |     with self.assertRaises(gn_helpers.GNException): | 
 |       parser = gn_helpers.GNValueParser('')  # Empty. | 
 |       parser.ParseString() | 
 |     with self.assertRaises(gn_helpers.GNException): | 
 |       parser = gn_helpers.GNValueParser('asdf')  # Unquoted. | 
 |       parser.ParseString() | 
 |     with self.assertRaises(gn_helpers.GNException): | 
 |       parser = gn_helpers.GNValueParser('"trailing')  # Unterminated. | 
 |       parser.ParseString() | 
 |  | 
 |   def test_ParseList(self): | 
 |     parser = gn_helpers.GNValueParser('[1,]')  # Optional end comma OK. | 
 |     self.assertEqual(parser.ParseList(), [ 1 ]) | 
 |  | 
 |     with self.assertRaises(gn_helpers.GNException): | 
 |       parser = gn_helpers.GNValueParser('')  # Empty. | 
 |       parser.ParseList() | 
 |     with self.assertRaises(gn_helpers.GNException): | 
 |       parser = gn_helpers.GNValueParser('asdf')  # No []. | 
 |       parser.ParseList() | 
 |     with self.assertRaises(gn_helpers.GNException): | 
 |       parser = gn_helpers.GNValueParser('[1, 2')  # Unterminated | 
 |       parser.ParseList() | 
 |     with self.assertRaises(gn_helpers.GNException): | 
 |       parser = gn_helpers.GNValueParser('[1 2]')  # No separating comma. | 
 |       parser.ParseList() | 
 |  | 
 |   def test_FromGNArgs(self): | 
 |     # Booleans and numbers should work; whitespace is allowed works. | 
 |     self.assertEqual(gn_helpers.FromGNArgs('foo = true\nbar = 1\n'), | 
 |                      {'foo': True, 'bar': 1}) | 
 |  | 
 |     # Whitespace is not required; strings should also work. | 
 |     self.assertEqual(gn_helpers.FromGNArgs('foo="bar baz"'), | 
 |                      {'foo': 'bar baz'}) | 
 |  | 
 |     # Lists should work. | 
 |     self.assertEqual(gn_helpers.FromGNArgs('foo=[1, 2, 3]'), | 
 |                      {'foo': [1, 2, 3]}) | 
 |  | 
 |     # Empty strings should return an empty dict. | 
 |     self.assertEqual(gn_helpers.FromGNArgs(''), {}) | 
 |     self.assertEqual(gn_helpers.FromGNArgs(' \n '), {}) | 
 |  | 
 |     # Non-identifiers should raise an exception. | 
 |     with self.assertRaises(gn_helpers.GNException): | 
 |       gn_helpers.FromGNArgs('123 = true') | 
 |  | 
 |     # References to other variables should raise an exception. | 
 |     with self.assertRaises(gn_helpers.GNException): | 
 |       gn_helpers.FromGNArgs('foo = bar') | 
 |  | 
 |     # References to functions should raise an exception. | 
 |     with self.assertRaises(gn_helpers.GNException): | 
 |       gn_helpers.FromGNArgs('foo = exec_script("//build/baz.py")') | 
 |  | 
 |     # Underscores in identifiers should work. | 
 |     self.assertEqual(gn_helpers.FromGNArgs('_foo = true'), | 
 |                      {'_foo': True}) | 
 |     self.assertEqual(gn_helpers.FromGNArgs('foo_bar = true'), | 
 |                      {'foo_bar': True}) | 
 |     self.assertEqual(gn_helpers.FromGNArgs('foo_=true'), | 
 |                      {'foo_': True}) | 
 |  | 
 | if __name__ == '__main__': | 
 |   unittest.main() |