Guest User

Untitled

a guest
Apr 23rd, 2018
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.79 KB | None | 0 0
  1. #
  2. # magical binding
  3. #
  4.  
  5. module RiotA
  6. module AssertionMacros
  7. # def equals(expected) puts "yay"; end
  8. def equals(expected) true; end
  9. end
  10.  
  11. class Assertion
  12. include AssertionMacros
  13. attr_reader :name, :actual
  14. def initialize(name, actual)
  15. @name, @actual = name, actual
  16. end
  17. end
  18.  
  19. class Context
  20. def initialize(name, &context_block) @context_block = context_block; end
  21. def run; @context_block.call; end
  22. end
  23.  
  24. module ContextMacros
  25. def asserts(name, &test_block) Assertion.new(name, test_block.call); end
  26. end
  27.  
  28. def self.context(name, &block)
  29. asserts_m = Object.instance_method(:asserts)
  30. ctx = Context.new(name, &block)
  31. asserts_m.bind(ctx)
  32. ctx.run
  33. end
  34. end
  35.  
  36. class Object
  37. include RiotA::ContextMacros
  38. end
  39.  
  40. #
  41. # instance eval
  42. #
  43.  
  44. module RiotB
  45. class Situation
  46. end
  47.  
  48. module AssertionMacros
  49. # def equals(expected) puts "aya"; end
  50. def equals(expected) true; end
  51. end
  52.  
  53. class Assertion
  54. include AssertionMacros
  55. attr_reader :name, :actual
  56. def initialize(name, sitution, &actual_block)
  57. @name, @actual = name, instance_eval(&actual_block)
  58. end
  59. end
  60.  
  61. class Context
  62. def initialize(name, &context_block)
  63. @situation = Situation.new
  64. instance_eval(&context_block)
  65. end
  66. def asserts(name, &test_block) Assertion.new(name, @situation, &test_block); end
  67. end
  68.  
  69. def self.context(name, &block)
  70. ctx = Context.new(name, &block)
  71. end
  72. end
  73.  
  74. #
  75. # Bench
  76. #
  77.  
  78. n = 100_000
  79.  
  80. require 'benchmark'
  81. Benchmark.bmbm do |x|
  82. x.report("Magical binding") do
  83. n.times do
  84. RiotA.context "foo" do
  85. asserts("something") { "foo" }.equals("bar")
  86. end
  87. end
  88. end
  89.  
  90. x.report("Instance eval (current)") do
  91. n.times do
  92. RiotB.context "foo" do
  93. asserts("something") { "foo" }.equals("bar")
  94. end
  95. end
  96. end
  97. end
Add Comment
Please, Sign In to add comment