# 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()