|  | // Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | import 'package:expect/expect.dart'; | 
|  | import 'package:compiler/src/js_backend/string_abbreviation.dart'; | 
|  |  | 
|  | void test(List<String> inputs, List<String> expected, {int minLength = 6}) { | 
|  | Expect.listEquals( | 
|  | expected, abbreviateToIdentifiers(inputs, minLength: minLength)); | 
|  | } | 
|  |  | 
|  | void main() { | 
|  | // No strings yields an empty pool. | 
|  | test([], []); | 
|  |  | 
|  | // Results identical stretches compressed-out. | 
|  | test( | 
|  | [ | 
|  | 'Greetings Bob Smith', | 
|  | 'Great work!', | 
|  | 'Greetings Alice', | 
|  | 'Greetings Bob Henry', | 
|  | ], | 
|  | [ | 
|  | 'GreetiBS', | 
|  | 'Great_', | 
|  | 'GreetiA', | 
|  | 'GreetiBH', | 
|  | ], | 
|  | ); | 
|  |  | 
|  | test( | 
|  | [ | 
|  | 'Greetings Bob Smith', | 
|  | 'Great work!', | 
|  | 'Greetings Alice', | 
|  | 'Greetings Bob Henry', | 
|  | ], | 
|  | [ | 
|  | 'GeBS', | 
|  | 'Ga', | 
|  | 'GeA', | 
|  | 'GeBH', | 
|  | ], | 
|  | minLength: 1, | 
|  | ); | 
|  |  | 
|  | // Non-identifiers are replaced with '_' if that is unambiguous. | 
|  | test( | 
|  | ['!pingpong', 'xylograph'], | 
|  | ['_pingp', 'xylogr'], | 
|  | ); | 
|  |  | 
|  | test(['\u1234\xff'], ['__']); | 
|  | test(['\u1234\xff', 'smile'], ['__', 'smile']); | 
|  |  | 
|  | test( | 
|  | ['a*b+c', '(x,y)', 'a*c-e', '(x,z)'], | 
|  | ['a_b_c', '_x_y_', 'a_c_e', '_x_z_'], | 
|  | ); | 
|  |  | 
|  | // Multiple discriminating non-identifier characters are replaced with an | 
|  | // escape, which causes a potentially ambiguous non-escape to be escaped. | 
|  | test( | 
|  | ['a xylograph', 'a !pingpong', 'a %percent'], | 
|  | ['a_x78ylo', 'a_x21pin', 'a_x25per'], | 
|  | ); | 
|  |  | 
|  | test( | 
|  | ['a\u1234z', 'auz'], | 
|  | ['a_z', 'auz'], | 
|  | ); | 
|  | test( | 
|  | ['a\u1234z', 'auz'], | 
|  | ['a_', 'au'], | 
|  | minLength: 1, | 
|  | ); | 
|  |  | 
|  | test( | 
|  | ['a\u1234z', 'auz', 'a&z'], | 
|  | ['au1234z', 'ax75z', 'ax26z'], | 
|  | ); | 
|  | test( | 
|  | ['a\u1234z', 'auz', 'a&z'], | 
|  | ['au1234', 'ax75', 'ax26'], | 
|  | minLength: 1, | 
|  | ); | 
|  |  | 
|  | test( | 
|  | ['a\u1234z', 'auz', 'a&z', 'a\u2345z'], | 
|  | ['au1234z', 'ax75z', 'ax26z', 'au2345z'], | 
|  | ); | 
|  | test( | 
|  | ['a\u1234z', 'auz', 'a&z', 'a\u2345z'], | 
|  | ['au1234', 'ax75', 'ax26', 'au2345'], | 
|  | minLength: 1, | 
|  | ); | 
|  |  | 
|  | test( | 
|  | ['a\u1234z', 'auz', 'a&z', 'a\u2345z', 'axe'], | 
|  | ['au1234z', 'ax75z', 'ax26z', 'au2345z', 'ax78e'], | 
|  | ); | 
|  | test( | 
|  | ['a\u1234z', 'auz', 'a&z', 'a\u2345z', 'axe'], | 
|  | ['au1234', 'ax75', 'ax26', 'au2345', 'ax78'], | 
|  | minLength: 1, | 
|  | ); | 
|  | } |