/interpreter/tags/at2dist110511/test/edu/vub/at/objects/mirrors/MirrorsOnNativesTest.java

http://ambienttalk.googlecode.com/ · Java · 80 lines · 62 code · 11 blank · 7 comment · 0 complexity · d6c6615f379444565e3dbcc93b4660fb MD5 · raw file

  1. package edu.vub.at.objects.mirrors;
  2. import edu.vub.at.AmbientTalkTest;
  3. import edu.vub.at.exceptions.InterpreterException;
  4. import edu.vub.at.exceptions.XIllegalOperation;
  5. import edu.vub.at.exceptions.XSelectorNotFound;
  6. import edu.vub.at.objects.ATClosure;
  7. import edu.vub.at.objects.ATMethod;
  8. import edu.vub.at.objects.ATObject;
  9. import edu.vub.at.objects.natives.NATNumber;
  10. import edu.vub.at.objects.natives.NATTable;
  11. import edu.vub.at.objects.natives.grammar.AGSymbol;
  12. /**
  13. * This class tests introspective mirror facilities on native objects.
  14. *
  15. * @author tvcutsem
  16. */
  17. public class MirrorsOnNativesTest extends AmbientTalkTest {
  18. public static void main(String[] args) {
  19. junit.swingui.TestRunner.run(MirrorsOnNativesTest.class);
  20. }
  21. public void setUp() {
  22. evalAndReturn("def mirrorOn1 := (reflect: 1)");
  23. }
  24. public void testInvocation() {
  25. evalAndCompareTo("mirrorOn1.invoke(mirrorOn1.base, .+(2))", "3");
  26. evalAndTestException("mirrorOn1.invoke(mirrorOn1.base, .foo(2))", XSelectorNotFound.class);
  27. }
  28. public void testRespondsTo() {
  29. evalAndCompareTo("mirrorOn1.respondsTo(`+)", "true");
  30. evalAndCompareTo("mirrorOn1.respondsTo(`foo)", "false");
  31. evalAndCompareTo("(reflect: mirrorOn1).respondsTo(`invoke)", "true");
  32. }
  33. public void testSelection() {
  34. try {
  35. ATObject clo = evalAndReturn("mirrorOn1.select(mirrorOn1.base, `+)");
  36. ATClosure c = clo.asClosure();
  37. ATMethod m = c.base_method();
  38. //assertEquals(NativeMethod.class, m.getClass());
  39. assertEquals(AGSymbol.jAlloc("+"), m.base_name());
  40. assertEquals(NATNumber.atValue(2), c.base_apply(NATTable.atValue(new ATObject[] { NATNumber.ONE })));
  41. } catch (InterpreterException e) {
  42. fail(e.getMessage());
  43. }
  44. }
  45. public void testAddition() {
  46. evalAndTestException("mirrorOn1.addField(object: { nil })", XIllegalOperation.class);
  47. evalAndTestException("mirrorOn1.addMethod(mirrorOn1.grabMethod(`+))", XIllegalOperation.class);
  48. }
  49. public void testAcquisition() {
  50. try {
  51. ATMethod nativeMethod = evalAndReturn("mirrorOn1.grabMethod(`+)").asMethod();
  52. assertEquals(NativeMethod.class, nativeMethod.getClass());
  53. assertEquals(AGSymbol.jAlloc("+"), nativeMethod.base_name());
  54. } catch (InterpreterException e) {
  55. fail(e.getMessage());
  56. }
  57. }
  58. public void testListing() {
  59. try {
  60. evalAndReturn("mirrorOn1.listMethods()").asTable();
  61. evalAndCompareTo("mirrorOn1.listFields()", "[]");
  62. // when mirroring a mirror and querying its methods, the accessor method 'base' should always be present
  63. evalAndCompareTo("{ |exit| (reflect: mirrorOn1).listMethods().each: { | method |" +
  64. " if: (method.name == `base) then: { exit(`foundit) } } }.escape()", "foundit");
  65. } catch (InterpreterException e) {
  66. fail(e.getMessage());
  67. }
  68. }
  69. }