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