xref: /aosp_15_r20/external/libchrome/build/gn_helpers_unittest.py (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker# Copyright 2016 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker# found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Workerimport gn_helpers
6*635a8641SAndroid Build Coastguard Workerimport unittest
7*635a8641SAndroid Build Coastguard Worker
8*635a8641SAndroid Build Coastguard Workerclass UnitTest(unittest.TestCase):
9*635a8641SAndroid Build Coastguard Worker  def test_ToGNString(self):
10*635a8641SAndroid Build Coastguard Worker    self.assertEqual(
11*635a8641SAndroid Build Coastguard Worker        gn_helpers.ToGNString([1, 'two', [ '"thr$\\', True, False, [] ]]),
12*635a8641SAndroid Build Coastguard Worker        '[ 1, "two", [ "\\"thr\\$\\\\", true, false, [  ] ] ]')
13*635a8641SAndroid Build Coastguard Worker
14*635a8641SAndroid Build Coastguard Worker  def test_UnescapeGNString(self):
15*635a8641SAndroid Build Coastguard Worker    # Backslash followed by a \, $, or " means the folling character without
16*635a8641SAndroid Build Coastguard Worker    # the special meaning. Backslash followed by everything else is a literal.
17*635a8641SAndroid Build Coastguard Worker    self.assertEqual(
18*635a8641SAndroid Build Coastguard Worker        gn_helpers.UnescapeGNString('\\as\\$\\\\asd\\"'),
19*635a8641SAndroid Build Coastguard Worker        '\\as$\\asd"')
20*635a8641SAndroid Build Coastguard Worker
21*635a8641SAndroid Build Coastguard Worker  def test_FromGNString(self):
22*635a8641SAndroid Build Coastguard Worker    self.assertEqual(
23*635a8641SAndroid Build Coastguard Worker        gn_helpers.FromGNString('[1, -20, true, false,["as\\"", []]]'),
24*635a8641SAndroid Build Coastguard Worker        [ 1, -20, True, False, [ 'as"', [] ] ])
25*635a8641SAndroid Build Coastguard Worker
26*635a8641SAndroid Build Coastguard Worker    with self.assertRaises(gn_helpers.GNException):
27*635a8641SAndroid Build Coastguard Worker      parser = gn_helpers.GNValueParser('123 456')
28*635a8641SAndroid Build Coastguard Worker      parser.Parse()
29*635a8641SAndroid Build Coastguard Worker
30*635a8641SAndroid Build Coastguard Worker  def test_ParseBool(self):
31*635a8641SAndroid Build Coastguard Worker    parser = gn_helpers.GNValueParser('true')
32*635a8641SAndroid Build Coastguard Worker    self.assertEqual(parser.Parse(), True)
33*635a8641SAndroid Build Coastguard Worker
34*635a8641SAndroid Build Coastguard Worker    parser = gn_helpers.GNValueParser('false')
35*635a8641SAndroid Build Coastguard Worker    self.assertEqual(parser.Parse(), False)
36*635a8641SAndroid Build Coastguard Worker
37*635a8641SAndroid Build Coastguard Worker  def test_ParseNumber(self):
38*635a8641SAndroid Build Coastguard Worker    parser = gn_helpers.GNValueParser('123')
39*635a8641SAndroid Build Coastguard Worker    self.assertEqual(parser.ParseNumber(), 123)
40*635a8641SAndroid Build Coastguard Worker
41*635a8641SAndroid Build Coastguard Worker    with self.assertRaises(gn_helpers.GNException):
42*635a8641SAndroid Build Coastguard Worker      parser = gn_helpers.GNValueParser('')
43*635a8641SAndroid Build Coastguard Worker      parser.ParseNumber()
44*635a8641SAndroid Build Coastguard Worker    with self.assertRaises(gn_helpers.GNException):
45*635a8641SAndroid Build Coastguard Worker      parser = gn_helpers.GNValueParser('a123')
46*635a8641SAndroid Build Coastguard Worker      parser.ParseNumber()
47*635a8641SAndroid Build Coastguard Worker
48*635a8641SAndroid Build Coastguard Worker  def test_ParseString(self):
49*635a8641SAndroid Build Coastguard Worker    parser = gn_helpers.GNValueParser('"asdf"')
50*635a8641SAndroid Build Coastguard Worker    self.assertEqual(parser.ParseString(), 'asdf')
51*635a8641SAndroid Build Coastguard Worker
52*635a8641SAndroid Build Coastguard Worker    with self.assertRaises(gn_helpers.GNException):
53*635a8641SAndroid Build Coastguard Worker      parser = gn_helpers.GNValueParser('')  # Empty.
54*635a8641SAndroid Build Coastguard Worker      parser.ParseString()
55*635a8641SAndroid Build Coastguard Worker    with self.assertRaises(gn_helpers.GNException):
56*635a8641SAndroid Build Coastguard Worker      parser = gn_helpers.GNValueParser('asdf')  # Unquoted.
57*635a8641SAndroid Build Coastguard Worker      parser.ParseString()
58*635a8641SAndroid Build Coastguard Worker    with self.assertRaises(gn_helpers.GNException):
59*635a8641SAndroid Build Coastguard Worker      parser = gn_helpers.GNValueParser('"trailing')  # Unterminated.
60*635a8641SAndroid Build Coastguard Worker      parser.ParseString()
61*635a8641SAndroid Build Coastguard Worker
62*635a8641SAndroid Build Coastguard Worker  def test_ParseList(self):
63*635a8641SAndroid Build Coastguard Worker    parser = gn_helpers.GNValueParser('[1,]')  # Optional end comma OK.
64*635a8641SAndroid Build Coastguard Worker    self.assertEqual(parser.ParseList(), [ 1 ])
65*635a8641SAndroid Build Coastguard Worker
66*635a8641SAndroid Build Coastguard Worker    with self.assertRaises(gn_helpers.GNException):
67*635a8641SAndroid Build Coastguard Worker      parser = gn_helpers.GNValueParser('')  # Empty.
68*635a8641SAndroid Build Coastguard Worker      parser.ParseList()
69*635a8641SAndroid Build Coastguard Worker    with self.assertRaises(gn_helpers.GNException):
70*635a8641SAndroid Build Coastguard Worker      parser = gn_helpers.GNValueParser('asdf')  # No [].
71*635a8641SAndroid Build Coastguard Worker      parser.ParseList()
72*635a8641SAndroid Build Coastguard Worker    with self.assertRaises(gn_helpers.GNException):
73*635a8641SAndroid Build Coastguard Worker      parser = gn_helpers.GNValueParser('[1, 2')  # Unterminated
74*635a8641SAndroid Build Coastguard Worker      parser.ParseList()
75*635a8641SAndroid Build Coastguard Worker    with self.assertRaises(gn_helpers.GNException):
76*635a8641SAndroid Build Coastguard Worker      parser = gn_helpers.GNValueParser('[1 2]')  # No separating comma.
77*635a8641SAndroid Build Coastguard Worker      parser.ParseList()
78*635a8641SAndroid Build Coastguard Worker
79*635a8641SAndroid Build Coastguard Worker  def test_FromGNArgs(self):
80*635a8641SAndroid Build Coastguard Worker    # Booleans and numbers should work; whitespace is allowed works.
81*635a8641SAndroid Build Coastguard Worker    self.assertEqual(gn_helpers.FromGNArgs('foo = true\nbar = 1\n'),
82*635a8641SAndroid Build Coastguard Worker                     {'foo': True, 'bar': 1})
83*635a8641SAndroid Build Coastguard Worker
84*635a8641SAndroid Build Coastguard Worker    # Whitespace is not required; strings should also work.
85*635a8641SAndroid Build Coastguard Worker    self.assertEqual(gn_helpers.FromGNArgs('foo="bar baz"'),
86*635a8641SAndroid Build Coastguard Worker                     {'foo': 'bar baz'})
87*635a8641SAndroid Build Coastguard Worker
88*635a8641SAndroid Build Coastguard Worker    # Lists should work.
89*635a8641SAndroid Build Coastguard Worker    self.assertEqual(gn_helpers.FromGNArgs('foo=[1, 2, 3]'),
90*635a8641SAndroid Build Coastguard Worker                     {'foo': [1, 2, 3]})
91*635a8641SAndroid Build Coastguard Worker
92*635a8641SAndroid Build Coastguard Worker    # Empty strings should return an empty dict.
93*635a8641SAndroid Build Coastguard Worker    self.assertEqual(gn_helpers.FromGNArgs(''), {})
94*635a8641SAndroid Build Coastguard Worker    self.assertEqual(gn_helpers.FromGNArgs(' \n '), {})
95*635a8641SAndroid Build Coastguard Worker
96*635a8641SAndroid Build Coastguard Worker    # Non-identifiers should raise an exception.
97*635a8641SAndroid Build Coastguard Worker    with self.assertRaises(gn_helpers.GNException):
98*635a8641SAndroid Build Coastguard Worker      gn_helpers.FromGNArgs('123 = true')
99*635a8641SAndroid Build Coastguard Worker
100*635a8641SAndroid Build Coastguard Worker    # References to other variables should raise an exception.
101*635a8641SAndroid Build Coastguard Worker    with self.assertRaises(gn_helpers.GNException):
102*635a8641SAndroid Build Coastguard Worker      gn_helpers.FromGNArgs('foo = bar')
103*635a8641SAndroid Build Coastguard Worker
104*635a8641SAndroid Build Coastguard Worker    # References to functions should raise an exception.
105*635a8641SAndroid Build Coastguard Worker    with self.assertRaises(gn_helpers.GNException):
106*635a8641SAndroid Build Coastguard Worker      gn_helpers.FromGNArgs('foo = exec_script("//build/baz.py")')
107*635a8641SAndroid Build Coastguard Worker
108*635a8641SAndroid Build Coastguard Worker    # Underscores in identifiers should work.
109*635a8641SAndroid Build Coastguard Worker    self.assertEqual(gn_helpers.FromGNArgs('_foo = true'),
110*635a8641SAndroid Build Coastguard Worker                     {'_foo': True})
111*635a8641SAndroid Build Coastguard Worker    self.assertEqual(gn_helpers.FromGNArgs('foo_bar = true'),
112*635a8641SAndroid Build Coastguard Worker                     {'foo_bar': True})
113*635a8641SAndroid Build Coastguard Worker    self.assertEqual(gn_helpers.FromGNArgs('foo_=true'),
114*635a8641SAndroid Build Coastguard Worker                     {'foo_': True})
115*635a8641SAndroid Build Coastguard Worker
116*635a8641SAndroid Build Coastguard Workerif __name__ == '__main__':
117*635a8641SAndroid Build Coastguard Worker  unittest.main()
118