tinheritance.nim 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. discard """
  2. nimout: '''Hello fred , managed by sally
  3. Hello sally , managed by bob'''
  4. """
  5. # bug #3973
  6. type
  7. EmployeeCode = enum
  8. ecCode1,
  9. ecCode2
  10. Person* = object of RootObj
  11. name* : string
  12. last_name*: string
  13. Employee* = object of Person
  14. empl_code* : EmployeeCode
  15. mgr_name* : string
  16. proc test() =
  17. var
  18. empl1 = Employee(name: "fred", last_name: "smith", mgr_name: "sally", empl_code: ecCode1)
  19. empl2 = Employee(name: "sally", last_name: "jones", mgr_name: "bob", empl_code: ecCode2)
  20. echo "Hello ", empl1.name, " , managed by ", empl1.mgr_name
  21. echo "Hello ", empl2.name, " , managed by ", empl2.mgr_name
  22. static:
  23. test()
  24. #----------------------------------------------
  25. # Bugs #9701 and #9702
  26. type
  27. MyKind = enum
  28. kA, kB, kC
  29. Base = ref object of RootObj
  30. x: string
  31. A = ref object of Base
  32. a: string
  33. B = ref object of Base
  34. b: string
  35. C = ref object of B
  36. c: string
  37. template check_templ(n: Base, k: MyKind) =
  38. if k == kA: doAssert(n of A) else: doAssert(not (n of A))
  39. if k in {kB, kC}: doAssert(n of B) else: doAssert(not (n of B))
  40. if k == kC: doAssert(n of C) else: doAssert(not (n of C))
  41. doAssert(n of Base)
  42. proc check_proc(n: Base, k: MyKind) =
  43. if k == kA: doAssert(n of A) else: doAssert(not (n of A))
  44. if k in {kB, kC}: doAssert(n of B) else: doAssert(not (n of B))
  45. if k == kC: doAssert(n of C) else: doAssert(not (n of C))
  46. doAssert(n of Base)
  47. static:
  48. let aa = new(A)
  49. check_templ(aa, kA)
  50. check_proc(aa, kA)
  51. let bb = new(B)
  52. check_templ(bb, kB)
  53. check_proc(bb, kB)
  54. let cc = new(C)
  55. check_templ(cc, kC)
  56. check_proc(cc, kC)
  57. let aa = new(A)
  58. check_templ(aa, kA)
  59. check_proc(aa, kA)
  60. let bb = new(B)
  61. check_templ(bb, kB)
  62. check_proc(bb, kB)
  63. let cc = new(C)
  64. check_templ(cc, kC)
  65. check_proc(cc, kC)