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