/interpreter/tags/at2-build190607/test/edu/vub/at/objects/mirrors/MirrorsOnNativesTest.java

http://ambienttalk.googlecode.com/ · Java · 80 lines · 63 code · 11 blank · 6 comment · 0 complexity · cf2c77a25f42114043e54abd3c7d2025 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_getMethod();
  38. assertEquals(NativeMethod.class, m.getClass());
  39. assertEquals(AGSymbol.jAlloc("+"), m.base_getName());
  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_getName());
  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()", "[<native field:super of 1>]");
  62. // when mirroring a mirror and querying its fields, the field 'base' should always be present
  63. evalAndCompareTo("{ |exit| (reflect: mirrorOn1).listFields().each: { |field|" +
  64. " if: (field.name == `base) then: { exit(`foundit) } } }.escape()", "foundit");
  65. } catch (InterpreterException e) {
  66. fail(e.getMessage());
  67. }
  68. }
  69. }