Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Rewrite the logic to pick methods off a class and its superclasses to do a better job handling interfaces, non-public classes, and so on. * Make the access check be a catch-all, so any exception raised will mean we don't have that access.
- Loading branch information
Showing
3 changed files
with
257 additions
and
90 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,138 @@ | ||
package java_integration.fixtures; | ||
|
||
import java.util.Collection; | ||
import java.util.Iterator; | ||
|
||
public class SuperWithInterface implements Collection<Object> { | ||
private static class SubClassWithoutInterfaces extends SuperWithInterface implements Runnable { | ||
public void run() {} | ||
|
||
// for testing that a single unique method on child does not cause all parent methods to disappear | ||
protected boolean add(String s) {return false;} | ||
public boolean add(Object s) {return true;} | ||
} | ||
|
||
public static SuperWithInterface getSubClassInstance() { | ||
return new SubClassWithoutInterfaces(); | ||
} | ||
|
||
public static class SuperWithoutInterface { | ||
// no interfaces, so we need to test that this doesn't cause | ||
// the equivalent child method to get removed | ||
public boolean add(Object s) { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
} | ||
|
||
public static class SubWithInterface extends SuperWithoutInterface implements Collection<Object> { | ||
private boolean add(String e) { | ||
return false; | ||
} | ||
|
||
public boolean add(Object e) { | ||
return true; | ||
} | ||
|
||
// impl methods, just to have them | ||
public int size() { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
|
||
public boolean isEmpty() { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
|
||
public boolean contains(Object o) { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
|
||
public Iterator<Object> iterator() { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
|
||
public Object[] toArray() { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
|
||
public <T> T[] toArray(T[] a) { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
|
||
public boolean remove(Object o) { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
|
||
public boolean containsAll(Collection<?> c) { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
|
||
public boolean addAll(Collection<? extends Object> c) { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
|
||
public boolean removeAll(Collection<?> c) { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
|
||
public boolean retainAll(Collection<?> c) { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
|
||
public void clear() { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
} | ||
|
||
// impl methods, just to have them | ||
public int size() { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
|
||
public boolean isEmpty() { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
|
||
public boolean contains(Object o) { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
|
||
public Iterator<Object> iterator() { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
|
||
public Object[] toArray() { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
|
||
public <T> T[] toArray(T[] a) { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
|
||
public boolean add(Object e) { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
|
||
public boolean remove(Object o) { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
|
||
public boolean containsAll(Collection<?> c) { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
|
||
public boolean addAll(Collection<? extends Object> c) { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
|
||
public boolean removeAll(Collection<?> c) { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
|
||
public boolean retainAll(Collection<?> c) { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
|
||
public void clear() { | ||
throw new UnsupportedOperationException("Not supported yet."); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
require File.dirname(__FILE__) + "/../spec_helper" | ||
|
||
java_import "java_integration.fixtures.SuperWithInterface" | ||
|
||
describe "A private subclass of a public superclass with interfaces" do | ||
it "defines all methods from those interfaces" do | ||
sub_without = SuperWithInterface.sub_class_instance | ||
|
||
# sub_without_cls = sub_without.class | ||
# | ||
# sub_without_cls.instance_methods.should include("size") | ||
# sub_without_cls.instance_methods.should include("empty?") | ||
# sub_without_cls.instance_methods.should include("contains?") | ||
# sub_without_cls.instance_methods.should include("iterator") | ||
# sub_without_cls.instance_methods.should include("to_array") | ||
# sub_without_cls.instance_methods.should include("add") | ||
# sub_without_cls.instance_methods.should include("remove") | ||
# sub_without_cls.instance_methods.should include("contains_all?") | ||
# sub_without_cls.instance_methods.should include("add_all") | ||
# sub_without_cls.instance_methods.should include("remove_all") | ||
# sub_without_cls.instance_methods.should include("retain_all") | ||
# sub_without_cls.instance_methods.should include("clear") | ||
|
||
# test that add can handle values other than string, since a | ||
# once-upon-a-time change caused child classes to only bind | ||
# unique methods, which in this case would be private boolean add(String) | ||
sub_without.add(1).should == true | ||
end | ||
end | ||
|
||
describe "A private subclass with interfaces" do | ||
it "defines all methods from those interfaces" do | ||
sub_without = SuperWithInterface.sub_class_instance | ||
|
||
sub_without_cls = sub_without.class | ||
|
||
sub_without_cls.instance_methods.should include("run") | ||
end | ||
end | ||
|
||
describe "A public subclass with interfaces extending a superclass that duplicates some of those methods" do | ||
it "should still bind all methods from the child" do | ||
sub_with = SuperWithInterface::SubWithInterface.new | ||
|
||
# test that add can handle values other than string, since a | ||
# once-upon-a-time change caused child classes to only bind | ||
# unique methods, which in this case would be private boolean add(String) | ||
sub_with.add(1).should == true | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters