1#!/usr/bin/env python 2# Copyright 2014 The Chromium Authors. All rights reserved. 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5 6"""Tests for enum_preprocess.py. 7 8This test suite containss various tests for the C++ -> Java enum generator. 9""" 10 11import collections 12import unittest 13from java_cpp_enum import EnumDefinition, GenerateOutput, HeaderParser 14 15class TestPreprocess(unittest.TestCase): 16 def testOutput(self): 17 definition = EnumDefinition(class_name='ClassName', 18 class_package='some.package', 19 entries=[('E1', 1), ('E2', '2 << 2')]) 20 output = GenerateOutput('path/to/file', definition) 21 expected = """ 22// Copyright 2014 The Chromium Authors. All rights reserved. 23// Use of this source code is governed by a BSD-style license that can be 24// found in the LICENSE file. 25 26// This file is autogenerated by 27// build/android/gyp/java_cpp_enum_tests.py 28// From 29// path/to/file 30 31package some.package; 32 33public class ClassName { 34 public static final int E1 = 1; 35 public static final int E2 = 2 << 2; 36} 37""" 38 self.assertEqual(expected, output) 39 40 def testParseSimpleEnum(self): 41 test_data = """ 42 // GENERATED_JAVA_ENUM_PACKAGE: test.namespace 43 enum EnumName { 44 VALUE_ZERO, 45 VALUE_ONE, 46 }; 47 """.split('\n') 48 definitions = HeaderParser(test_data).ParseDefinitions() 49 self.assertEqual(1, len(definitions)) 50 definition = definitions[0] 51 self.assertEqual('EnumName', definition.class_name) 52 self.assertEqual('test.namespace', definition.class_package) 53 self.assertEqual(collections.OrderedDict([('VALUE_ZERO', 0), 54 ('VALUE_ONE', 1)]), 55 definition.entries) 56 57 def testParseTwoEnums(self): 58 test_data = """ 59 // GENERATED_JAVA_ENUM_PACKAGE: test.namespace 60 enum EnumOne { 61 ENUM_ONE_A = 1, 62 // Comment there 63 ENUM_ONE_B = A, 64 }; 65 66 enum EnumIgnore { 67 C, D, E 68 }; 69 70 // GENERATED_JAVA_ENUM_PACKAGE: other.package 71 // GENERATED_JAVA_PREFIX_TO_STRIP: P_ 72 enum EnumTwo { 73 P_A, 74 P_B 75 }; 76 """.split('\n') 77 definitions = HeaderParser(test_data).ParseDefinitions() 78 self.assertEqual(2, len(definitions)) 79 definition = definitions[0] 80 self.assertEqual('EnumOne', definition.class_name) 81 self.assertEqual('test.namespace', definition.class_package) 82 self.assertEqual(collections.OrderedDict([('A', '1'), 83 ('B', 'A')]), 84 definition.entries) 85 86 definition = definitions[1] 87 self.assertEqual('EnumTwo', definition.class_name) 88 self.assertEqual('other.package', definition.class_package) 89 self.assertEqual(collections.OrderedDict([('A', 0), 90 ('B', 1)]), 91 definition.entries) 92 93 def testEnumValueAssignmentNoneDefined(self): 94 definition = EnumDefinition('c', 'p', []) 95 definition.AppendEntry('A', None) 96 definition.AppendEntry('B', None) 97 definition.AppendEntry('C', None) 98 definition.Finalize() 99 self.assertEqual(collections.OrderedDict([('A', 0), 100 ('B', 1), 101 ('C', 2)]), 102 definition.entries) 103 104 def testEnumValueAssignmentAllDefined(self): 105 definition = EnumDefinition('c', 'p', []) 106 definition.AppendEntry('A', '1') 107 definition.AppendEntry('B', '2') 108 definition.AppendEntry('C', '3') 109 definition.Finalize() 110 self.assertEqual(collections.OrderedDict([('A', '1'), 111 ('B', '2'), 112 ('C', '3')]), 113 definition.entries) 114 115 def testEnumValueAssignmentReferences(self): 116 definition = EnumDefinition('c', 'p', []) 117 definition.AppendEntry('A', None) 118 definition.AppendEntry('B', 'A') 119 definition.AppendEntry('C', None) 120 definition.AppendEntry('D', 'C') 121 definition.Finalize() 122 self.assertEqual(collections.OrderedDict([('A', 0), 123 ('B', 0), 124 ('C', 1), 125 ('D', 1)]), 126 definition.entries) 127 128 def testEnumValueAssignmentRaises(self): 129 definition = EnumDefinition('c', 'p', []) 130 definition.AppendEntry('A', None) 131 definition.AppendEntry('B', '1') 132 definition.AppendEntry('C', None) 133 with self.assertRaises(Exception): 134 definition.Finalize() 135 136 def testExplicitPrefixStripping(self): 137 definition = EnumDefinition('c', 'p', []) 138 definition.AppendEntry('P_A', None) 139 definition.AppendEntry('B', None) 140 definition.AppendEntry('P_C', None) 141 definition.prefix_to_strip = 'P_' 142 definition.Finalize() 143 self.assertEqual(['A', 'B', 'C'], definition.entries.keys()) 144 145 def testImplicitPrefixStripping(self): 146 definition = EnumDefinition('ClassName', 'p', []) 147 definition.AppendEntry('CLASS_NAME_A', None) 148 definition.AppendEntry('CLASS_NAME_B', None) 149 definition.AppendEntry('CLASS_NAME_C', None) 150 definition.Finalize() 151 self.assertEqual(['A', 'B', 'C'], definition.entries.keys()) 152 153 def testImplicitPrefixStrippingRequiresAllConstantsToBePrefixed(self): 154 definition = EnumDefinition('Name', 'p', []) 155 definition.AppendEntry('A', None) 156 definition.AppendEntry('B', None) 157 definition.AppendEntry('NAME_LAST', None) 158 definition.Finalize() 159 self.assertEqual(['A', 'B', 'NAME_LAST'], definition.entries.keys()) 160 161 162if __name__ == '__main__': 163 unittest.main() 164