- Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathabout_java_interop.rb
More file actions
Latest commit
137 lines (115 loc) · 4.06 KB
/
Copy pathabout_java_interop.rb
File metadata and controls
137 lines (115 loc) · 4.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
requireFile.expand_path(File.dirname(__FILE__) + '/edgecase')
includeJava
# Concepts
# * Pull in a java class
# * calling a method, Camel vs snake
# * Resolving module/class name conflicts
# * Showing what gets returned
# * Ruby Strings VS Java Strings
# * Calling custom java class
# * Calling Ruby from java???
classAboutJavaInterop < EdgeCase::Koan
deftest_using_a_java_library_class
java_array=java.util.ArrayList.new
assert_equal__,java_array.class
end
deftest_java_class_can_be_referenced_using_both_ruby_and_java_like_syntax
assert_equal__,Java::JavaUtil::ArrayList == java.util.ArrayList
end
deftest_include_class_includes_class_in_module_scope
assert_nildefined?(TreeSet)
include_class"java.util.TreeSet"
assert_equal__,defined?(TreeSet)
end
# THINK ABOUT IT:
#
# What if we use:
#
# include_class "java.lang.String"
#
# What would be the value of the String constant after this
# include_class is run? Would it be useful to provide a way of
# aliasing java classes to different names?
JString=java.lang.String
deftest_also_java_class_can_be_given_ruby_aliases
java_string=JString.new("A Java String")
assert_equal__,java_string.class
assert_equal__,JString
end
deftest_can_directly_call_java_methods_on_java_objects
java_string=JString.new("A Java String")
assert_equal__,java_string.toLowerCase
end
deftest_jruby_provides_snake_case_versions_of_java_methods
java_string=JString.new("A Java String")
assert_equal__,java_string.to_lower_case
end
deftest_jruby_provides_question_mark_versions_of_boolean_methods
java_string=JString.new("A Java String")
assert_equal__,java_string.endsWith("String")
assert_equal__,java_string.ends_with("String")
assert_equal__,java_string.ends_with?("String")
end
deftest_java_string_are_not_ruby_strings
ruby_string="A Java String"
java_string=java.lang.String.new(ruby_string)
assert_equal__,java_string.is_a?(java.lang.String)
assert_equal__,java_string.is_a?(String)
end
deftest_java_strings_can_be_compared_to_ruby_strings_maybe
ruby_string="A Java String"
java_string=java.lang.String.new(ruby_string)
assert_equal__,ruby_string == java_string
assert_equal__,java_string == ruby_string
# THINK ABOUT IT:
#
# Is there any possible way for this to be more wrong?
#
# SERIOUSLY, THINK ABOUT IT:
#
# Why do you suppose that Ruby and Java strings compare like that?
#
# ADVANCED THINK ABOUT IT:
#
# Is there a way to make Ruby/Java string comparisons commutative?
# How would you do it?
end
deftest_however_most_methods_returning_strings_return_ruby_strings
java_array=java.util.ArrayList.new
assert_equal__,java_array.toString
assert_equal__,java_array.toString.is_a?(String)
assert_equal__,java_array.toString.is_a?(java.lang.String)
end
deftest_some_ruby_objects_can_be_coerced_to_java
assert_equal__,"ruby string".to_java.class
assert_equal__,1.to_java.class
assert_equal__,9.32.to_java.class
assert_equal__,false.to_java.class
end
deftest_some_ruby_objects_are_not_coerced_to_what_you_might_expect
assert_equal__,[].to_java.class == Java::JavaUtil::ArrayList
assert_equal__,{}.to_java.class == Java::JavaUtil::HashMap
assert_equal__,Object.new.to_java.class == Java::JavaLang::Object
end
deftest_java_collections_are_enumerable
java_array=java.util.ArrayList.new
java_array << "one" << "two" << "three"
assert_equal__,java_array.map{ |item| item.upcase}
end
# ------------------------------------------------------------------
# Open the Java ArrayList class and add a new method.
classJava::JavaUtil::ArrayList
defmultiply_all
result=1
eachdo |item|
result *= item
end
result
end
end
deftest_java_class_are_open_from_ruby
java_array=java.util.ArrayList.new
java_array.add_all([1,2,3,4,5])
assert_equal__,java_array.multiply_all
end
end