Skip to content

Commit

Permalink
Generate rspec and bogus specs
Browse files Browse the repository at this point in the history
  • Loading branch information
psyho committed Aug 13, 2013
1 parent cc91f89 commit 9d0b155
Show file tree
Hide file tree
Showing 3 changed files with 122 additions and 0 deletions.
2 changes: 2 additions & 0 deletions benchmark/.gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
lib
spec_rspec
spec_bogus
116 changes: 116 additions & 0 deletions benchmark/generate.rb
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,115 @@ def call_#{d.as_var}(x)
end
end

class BogusDSL
def configure
"require 'bogus/rspec'"
end

def dependency(klass)
"fake(#{klass.as_sym})"
end

def stub_method(dep)
"stub(#{dep.as_var}).foo(2) { :hello }"
end
end

class RspecDSL
def configure
end

def dependency(klass)
"let(#{klass.as_sym}) { double }"
end

def stub_method(dep)
"#{dep.as_var}.stub(:foo).with(2).and_return(:hello)"
end
end

class KlassSpecPresenter
attr_reader :klass, :dsl

def initialize(klass, dsl)
@klass = klass
@dsl = dsl
end

def body
<<EOF
require_relative '../spec_helper'
describe #{klass.as_const} do
#{fakes.join("\n")}
#{subject}
#{examples.join("\n\n")}
end
EOF
end

def subject
deps = klass.dependencies.map(&:as_var)
"let(#{klass.as_sym}) { #{klass.as_const}.new(#{deps.join(", ")}) } "
end

def fakes
klass.dependencies.map do |d|
dsl.dependency(d)
end
end

def examples
klass.dependencies.map do |d|
<<EOF
it "calls #{d.as_var}" do
#{dsl.stub_method(d)}
#{klass.as_var}.call_#{d.as_var}(1).should == :hello
end
EOF
end
end
end

def save_manifest(classes)
requires = classes.map do |c|
%Q[require "klasses/#{c.as_var}"]
end
manifest = <<EOF
$: << File.expand_path("..", __FILE__)
#{requires.join("\n")}
EOF

File.write("lib/project.rb", manifest)
end

def save_spec_helper(dsl, path)
File.write "#{path}/spec_helper.rb", <<EOF
require_relative "../lib/project.rb"
#{dsl.configure}
RSpec.configure do |c|
c.color_enabled = true
end
EOF
end

def save_specs(dsl, path, classes)
FileUtils.rm_rf(path)
FileUtils.mkdir_p("#{path}/klasses")

save_spec_helper(dsl, path)
classes.each do |c|
spec_presenter = KlassSpecPresenter.new(c, dsl)
File.write("#{path}/klasses/#{c.as_var}_spec.rb", spec_presenter.body)
end
end

class_names = num_classes.times.map do
alphabet.sample(5).join
end
Expand All @@ -112,8 +221,15 @@ def call_#{d.as_var}(x)

require 'fileutils'

FileUtils.rm_rf("lib")
FileUtils.mkdir_p("lib/klasses")

classes.each do |k|
body = KlassBodyPresenter.new(k).body
File.write("lib/klasses/#{k.name}.rb", body)
end

save_manifest(classes)
save_specs(BogusDSL.new, "spec_bogus", classes)
save_specs(RspecDSL.new, "spec_rspec", classes)

4 changes: 4 additions & 0 deletions benchmark/run
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/bin/bash

time rspec spec_bogus
time rspec spec_rspec

0 comments on commit 9d0b155

Please sign in to comment.