/interpreter/tags/at2dist170907/test/edu/vub/at/objects/natives/TypeTagTest.java

http://ambienttalk.googlecode.com/ · Java · 103 lines · 51 code · 18 blank · 34 comment · 0 complexity · 9b4d6b4479f73bff4ef93ff4e422e3fc MD5 · raw file

  1. package edu.vub.at.objects.natives;
  2. import edu.vub.at.AmbientTalkTest;
  3. import edu.vub.at.eval.Evaluator;
  4. import edu.vub.at.exceptions.InterpreterException;
  5. import edu.vub.at.objects.ATObject;
  6. import edu.vub.at.objects.ATTypeTag;
  7. import edu.vub.at.objects.natives.grammar.AGSymbol;
  8. /**
  9. * Tests type definition, tagging, checking.
  10. *
  11. * @author tvcutsem
  12. */
  13. public class TypeTagTest extends AmbientTalkTest {
  14. // test fixture
  15. // deftype A <: Type;
  16. private NATTypeTag typeA_ = NATTypeTag.atValue(AGSymbol.jAlloc("A"), NATTable.EMPTY);
  17. // deftype B <: A;
  18. private NATTypeTag typeB_ = NATTypeTag.atValue(AGSymbol.jAlloc("B"),
  19. NATTable.atValue(new ATObject[] { typeA_ }));
  20. // deftype C <: A;
  21. private NATTypeTag typeC_ = NATTypeTag.atValue(AGSymbol.jAlloc("C"),
  22. NATTable.atValue(new ATObject[] { typeA_ }));
  23. // deftype D <: B, C;
  24. private NATTypeTag typeD_ = NATTypeTag.atValue(AGSymbol.jAlloc("D"),
  25. NATTable.atValue(new ATObject[] { typeB_, typeC_ }));
  26. // object: { nil } taggedAs: [ B ]
  27. private NATObject typed_ = new NATObject(Evaluator.getGlobalLexicalScope(), new ATTypeTag[] { typeB_ });
  28. // types defined without supertypes have the root type as single supertype
  29. public void testParentlessType() throws InterpreterException {
  30. assertTrue(typeA_.base_superTypes().base_length().equals(NATNumber.ONE));
  31. ATTypeTag root = typeA_.base_superTypes().base_at(NATNumber.ONE).asTypeTag();
  32. assertEquals(NATTypeTag.OBJRootType._INSTANCE_, root);
  33. }
  34. // type tag subtyping:
  35. public void testPositiveSubtyping() throws InterpreterException {
  36. ATTypeTag root = NATTypeTag.OBJRootType._INSTANCE_;
  37. // root <: root
  38. assertTrue(root.base_isSubtypeOf(root).asNativeBoolean().javaValue);
  39. // A <: A
  40. assertTrue(typeA_.base_isSubtypeOf(typeA_).asNativeBoolean().javaValue);
  41. // A <: root
  42. assertTrue(typeA_.base_isSubtypeOf(root).asNativeBoolean().javaValue);
  43. // B <: A
  44. assertTrue(typeB_.base_isSubtypeOf(typeA_).asNativeBoolean().javaValue);
  45. // D <: B
  46. assertTrue(typeD_.base_isSubtypeOf(typeB_).asNativeBoolean().javaValue);
  47. // D <: C
  48. assertTrue(typeD_.base_isSubtypeOf(typeC_).asNativeBoolean().javaValue);
  49. // D <: A
  50. assertTrue(typeD_.base_isSubtypeOf(typeA_).asNativeBoolean().javaValue);
  51. // D <: root
  52. assertTrue(typeD_.base_isSubtypeOf(root).asNativeBoolean().javaValue);
  53. }
  54. public void testNegativeSubtyping() throws InterpreterException {
  55. ATTypeTag root = NATTypeTag.OBJRootType._INSTANCE_;
  56. // root <: A
  57. assertFalse(root.base_isSubtypeOf(typeA_).asNativeBoolean().javaValue);
  58. // A <: D
  59. assertFalse(typeA_.base_isSubtypeOf(typeD_).asNativeBoolean().javaValue);
  60. // A <: B
  61. assertFalse(typeA_.base_isSubtypeOf(typeB_).asNativeBoolean().javaValue);
  62. // B <: C
  63. assertFalse(typeB_.base_isSubtypeOf(typeC_).asNativeBoolean().javaValue);
  64. // C <: B
  65. assertFalse(typeC_.base_isSubtypeOf(typeB_).asNativeBoolean().javaValue);
  66. // B <: D
  67. assertFalse(typeB_.base_isSubtypeOf(typeD_).asNativeBoolean().javaValue);
  68. }
  69. // object type testing:
  70. public void testObjectTypes() throws InterpreterException {
  71. // is: typed_ taggedAs: B => true
  72. assertTrue(typed_.meta_isTaggedAs(typeB_).asNativeBoolean().javaValue);
  73. // is: typed_ taggedAs: A => true
  74. assertTrue(typed_.meta_isTaggedAs(typeA_).asNativeBoolean().javaValue);
  75. // is: typed_ taggedAs: D => false
  76. assertFalse(typed_.meta_isTaggedAs(typeD_).asNativeBoolean().javaValue);
  77. // is: typed_ taggedAs: root => true
  78. assertTrue(typed_.meta_isTaggedAs(NATTypeTag.OBJRootType._INSTANCE_).asNativeBoolean().javaValue);
  79. // is: typed_ taggedAs: C => false
  80. assertFalse(typed_.meta_isTaggedAs(typeC_).asNativeBoolean().javaValue);
  81. // negative test: object has no types
  82. NATObject notypes = new NATObject();
  83. assertFalse(notypes.meta_isTaggedAs(typeB_).asNativeBoolean().javaValue);
  84. }
  85. }