You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

109 lines
4.8 KiB

(*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
open! IStd
open OUnit2
open JavaClassName
let assert_equal_to classname ~expected_package ~expected_classname =
assert_equal ~printer:JavaClassName.to_string classname
(make ~package:expected_package ~classname:expected_classname)
let assert_some = function Some a -> a | None -> assert_failure "Expected Some, got None"
let assert_none = function Some _ -> assert_failure "Expected None, got Some" | None -> ()
let test_from_string =
"test_from_string"
>:: fun _ ->
assert_equal_to
(from_string "some.package.SomeClass")
~expected_package:(Some "some.package") ~expected_classname:"SomeClass" ;
assert_equal_to (from_string "SomeClass") ~expected_package:None ~expected_classname:"SomeClass" ;
assert_equal_to
(from_string "some.package.SomeClass$NestedClass")
~expected_package:(Some "some.package") ~expected_classname:"SomeClass$NestedClass" ;
assert_equal_to
(from_string "SomeClass$NestedClass")
~expected_package:None ~expected_classname:"SomeClass$NestedClass" ;
(* anonymous classes *)
assert_equal_to
(from_string "some.package.SomeClass$1")
~expected_package:(Some "some.package") ~expected_classname:"SomeClass$1" ;
(* anonymous classes can be of nested levels *)
assert_equal_to
(from_string "some.package.SomeClass$1$3")
~expected_package:(Some "some.package") ~expected_classname:"SomeClass$1$3" ;
(* anonymous classes can be inside nested *)
assert_equal_to
(from_string "SomeClass$NestedClass$1$3")
~expected_package:None ~expected_classname:"SomeClass$NestedClass$1$3"
let test_anonymous =
"test_anonymous"
>:: fun _ ->
(* If it is not an anonymous class, we expect this to return None *)
get_user_defined_class_if_anonymous_inner
(make ~package:(Some "some.package") ~classname:"SomeClass")
|> assert_none ;
get_user_defined_class_if_anonymous_inner (make ~package:None ~classname:"SomeClass")
|> assert_none ;
get_user_defined_class_if_anonymous_inner
(make ~package:(Some "some.package") ~classname:"SomeClass$SomeNestedClass$AgainNestedClass")
|> assert_none ;
(* If it is an anonymous class, we expect this to be detected *)
get_user_defined_class_if_anonymous_inner
(make ~package:(Some "some.package") ~classname:"SomeClass$17")
|> assert_some
|> assert_equal_to ~expected_package:(Some "some.package") ~expected_classname:"SomeClass" ;
(* Can be several nested anonymous classes *)
get_user_defined_class_if_anonymous_inner
(make ~package:(Some "some.package") ~classname:"SomeClass$17$23$1")
|> assert_some
|> assert_equal_to ~expected_package:(Some "some.package") ~expected_classname:"SomeClass" ;
(* Can be nested class with anonymous class *)
get_user_defined_class_if_anonymous_inner
(make ~package:(Some "some.package") ~classname:"SomeClass$NestedClass$AgainNestedClass$17")
|> assert_some
|> assert_equal_to ~expected_package:(Some "some.package")
~expected_classname:"SomeClass$NestedClass$AgainNestedClass" ;
(* Can be nested class AND several nested anonymous classes *)
get_user_defined_class_if_anonymous_inner
(make ~package:(Some "some.package")
~classname:"SomeClass$NestedClass$AgainNestedClass$17$23$1")
|> assert_some
|> assert_equal_to ~expected_package:(Some "some.package")
~expected_classname:"SomeClass$NestedClass$AgainNestedClass" ;
(* If it is a lambda class, we expect this to be detected *)
get_user_defined_class_if_anonymous_inner
(make ~package:(Some "some.package") ~classname:"SomeClass$Lambda$_4_1")
|> assert_some
|> assert_equal_to ~expected_package:(Some "some.package") ~expected_classname:"SomeClass" ;
(* Lambda might be inside anonymous (or several ones in general case) *)
get_user_defined_class_if_anonymous_inner
(make ~package:(Some "some.package") ~classname:"SomeClass$1$7$Lambda$_4_1")
|> assert_some
|> assert_equal_to ~expected_package:(Some "some.package") ~expected_classname:"SomeClass" ;
(* The most general case: nested class, lambda, and anonymous mixed *)
get_user_defined_class_if_anonymous_inner
(make ~package:(Some "some.package")
~classname:"SomeClass$NestedClass$7$1$Lambda$_4_1$2$Lambda$_7_18$19$16")
|> assert_some
|> assert_equal_to ~expected_package:(Some "some.package")
~expected_classname:"SomeClass$NestedClass" ;
(* If package was empty, everything should still work *)
get_user_defined_class_if_anonymous_inner
(make ~package:None ~classname:"SomeClass$NestedClass$AgainNestedClass$17$23$1")
|> assert_some
|> assert_equal_to ~expected_package:None
~expected_classname:"SomeClass$NestedClass$AgainNestedClass"
let tests = "JavaClassNameTests" >::: [test_from_string; test_anonymous]