1#!/usr/bin/env python3 2 3# Copyright 2019 The Chromium Authors 4# Use of this source code is governed by a BSD-style license that can be 5# found in the LICENSE file. 6 7"""Tests for java_cpp_strings.py. 8 9This test suite contains various tests for the C++ -> Java string generator. 10""" 11 12import unittest 13 14import java_cpp_strings 15from util import java_cpp_utils 16 17 18class _TestStringsParser(unittest.TestCase): 19 20 def testParseComments(self): 21 test_data = """ 22/** 23 * This should be ignored as well. 24 */ 25 26// Comment followed by a blank line. 27 28// Comment followed by unrelated code. 29int foo() { return 3; } 30 31// Real comment. 32const char kASwitch[] = "a-value"; 33 34// Real comment that spans 35// multiple lines. 36const char kAnotherSwitch[] = "another-value"; 37 38// Comment followed by nothing. 39""".split('\n') 40 string_file_parser = java_cpp_utils.CppConstantParser( 41 java_cpp_strings.StringParserDelegate(), test_data) 42 strings = string_file_parser.Parse() 43 self.assertEqual(2, len(strings)) 44 self.assertEqual('A_SWITCH', strings[0].name) 45 self.assertEqual('"a-value"', strings[0].value) 46 self.assertEqual(1, len(strings[0].comments.split('\n'))) 47 self.assertEqual('ANOTHER_SWITCH', strings[1].name) 48 self.assertEqual('"another-value"', strings[1].value) 49 self.assertEqual(2, len(strings[1].comments.split('\n'))) 50 51 def testStringValues(self): 52 test_data = r""" 53// Single line string constants. 54const char kAString[] = "a-value"; 55const char kNoComment[] = "no-comment"; 56 57namespace myfeature { 58const char kMyFeatureNoComment[] = "myfeature.no-comment"; 59} 60 61// Single line switch with a big space. 62const char kAStringWithSpace[] = "a-value"; 63 64// Wrapped constant definition. 65const char kAStringWithAVeryLongNameThatWillHaveToWrap[] = 66 "a-string-with-a-very-long-name-that-will-have-to-wrap"; 67 68// This one has no comment before it. 69 70const char kAStringWithAVeryLongNameThatWillHaveToWrap2[] = 71 "a-string-with-a-very-long-name-that-will-have-to-wrap2"; 72 73const char kStringWithEscapes[] = "tab\tquote\"newline\n"; 74const char kStringWithEscapes2[] = 75 "tab\tquote\"newline\n"; 76 77const char kEmptyString[] = ""; 78 79// These are valid C++ but not currently supported by the script. 80const char kInvalidLineBreak[] = 81 82 "invalid-line-break"; 83 84const char kConcatenateMultipleStringLiterals[] = 85 "first line" 86 "second line"; 87""".split('\n') 88 string_file_parser = java_cpp_utils.CppConstantParser( 89 java_cpp_strings.StringParserDelegate(), test_data) 90 strings = string_file_parser.Parse() 91 self.assertEqual(9, len(strings)) 92 self.assertEqual('A_STRING', strings[0].name) 93 self.assertEqual('"a-value"', strings[0].value) 94 self.assertEqual('NO_COMMENT', strings[1].name) 95 self.assertEqual('"no-comment"', strings[1].value) 96 self.assertEqual('MY_FEATURE_NO_COMMENT', strings[2].name) 97 self.assertEqual('"myfeature.no-comment"', strings[2].value) 98 self.assertEqual('A_STRING_WITH_SPACE', strings[3].name) 99 self.assertEqual('"a-value"', strings[3].value) 100 self.assertEqual('A_STRING_WITH_A_VERY_LONG_NAME_THAT_WILL_HAVE_TO_WRAP', 101 strings[4].name) 102 self.assertEqual('"a-string-with-a-very-long-name-that-will-have-to-wrap"', 103 strings[4].value) 104 self.assertEqual('A_STRING_WITH_A_VERY_LONG_NAME_THAT_WILL_HAVE_TO_WRAP2', 105 strings[5].name) 106 self.assertEqual('"a-string-with-a-very-long-name-that-will-have-to-wrap2"', 107 strings[5].value) 108 self.assertEqual('STRING_WITH_ESCAPES', strings[6].name) 109 self.assertEqual(r'"tab\tquote\"newline\n"', strings[6].value) 110 self.assertEqual('STRING_WITH_ESCAPES2', strings[7].name) 111 self.assertEqual(r'"tab\tquote\"newline\n"', strings[7].value) 112 self.assertEqual('EMPTY_STRING', strings[8].name) 113 self.assertEqual('""', strings[8].value) 114 115 def testTreatWebViewLikeOneWord(self): 116 test_data = """ 117const char kSomeWebViewSwitch[] = "some-webview-switch"; 118const char kWebViewOtherSwitch[] = "webview-other-switch"; 119const char kSwitchWithPluralWebViews[] = "switch-with-plural-webviews"; 120""".split('\n') 121 string_file_parser = java_cpp_utils.CppConstantParser( 122 java_cpp_strings.StringParserDelegate(), test_data) 123 strings = string_file_parser.Parse() 124 self.assertEqual('SOME_WEBVIEW_SWITCH', strings[0].name) 125 self.assertEqual('"some-webview-switch"', strings[0].value) 126 self.assertEqual('WEBVIEW_OTHER_SWITCH', strings[1].name) 127 self.assertEqual('"webview-other-switch"', strings[1].value) 128 self.assertEqual('SWITCH_WITH_PLURAL_WEBVIEWS', strings[2].name) 129 self.assertEqual('"switch-with-plural-webviews"', strings[2].value) 130 131 def testTemplateParsing(self): 132 test_data = """ 133// Copyright 2019 The Chromium Authors 134// Use of this source code is governed by a BSD-style license that can be 135// found in the LICENSE file. 136 137package my.java.package; 138 139public any sort of class MyClass {{ 140 141{NATIVE_STRINGS} 142 143}} 144""".split('\n') 145 package, class_name = java_cpp_utils.ParseTemplateFile(test_data) 146 self.assertEqual('my.java.package', package) 147 self.assertEqual('MyClass', class_name) 148 149 150if __name__ == '__main__': 151 unittest.main() 152