Permalink
Browse files

* Updated test

   * removed yield next test - this was obsolete
   * fixed bugs in markdown syntax
   * added test for meta api
   * fixed problems in thread scope test
   * Literate Maruku HTML files have a layout now
 * Version No 0.1.9 - a 0.2.0 preview release
 * updated manifest
 * let inner_class catch fetch method with blocks as well
 


git-svn-id: svn+ssh://rubyforge.org/var/svn/contextr/trunk@76 b232672f-569e-4225-9534-19f781cde581
  • Loading branch information...
1 parent ca1977a commit eff7896d6ea0bf9d0a3f76008482b2f9debf6725 schmidt committed Nov 30, 2007
View
@@ -41,7 +41,7 @@ test/test_introduction.mkd
test/test_introduction.rb
test/test_layer_state.mkd
test/test_layer_state.rb
+test/test_meta_api.mkd
+test/test_meta_api.rb
test/test_ordering.mkd
test/test_ordering.rb
-test/test_yield_next.mkd
-test/test_yield_next.rb
@@ -26,7 +26,7 @@ def claimed
true
end
- module OneMethods
+ in_layer :once do
def once
true
end
@@ -35,20 +35,17 @@ def twice
end
end
- module TwoMethods
+ in_layer :two do
def twice
true
end
end
-
- include OneMethods => :one,
- TwoMethods => :two
end
f = Foo.new
n = 100_000
-Benchmark.bm(20) do |x|
+Benchmark.bmbm(20) do |x|
x.report("Ordinary:") {
n.times { f.ordinary }
}
@@ -75,24 +72,20 @@ def twice
end
__END__
-n = 1_000_000
+n = 100_000 (bmbm to warm up the jvm)
+
+ruby 1.8.6
user system total real
-Ordinary: 0.410000 0.000000 0.410000 ( 0.406774)
-Once (w/o): 6.080000 0.010000 6.090000 ( 6.148515)
-Once (ctx): 16.560000 0.020000 16.580000 ( 16.700489)
-Twice (w/o): 6.100000 0.010000 6.110000 ( 6.113543)
-Twice (ctx): 18.620000 0.010000 18.630000 ( 18.686153)
-Wrapped (w/o): 6.140000 0.010000 6.150000 ( 6.152476)
-Wrapped (ctx): 29.740000 0.030000 29.770000 ( 29.816371)
-All wrappers (ctx): 37.250000 0.040000 37.290000 ( 37.344437)
+Ordinary: 0.040000 0.000000 0.040000 ( 0.041294)
+Once (w/o): 1.030000 0.010000 1.040000 ( 1.043971)
+Once (ctx): 1.540000 0.000000 1.540000 ( 1.598743)
+Twice (w/o): 1.030000 0.010000 1.040000 ( 1.055684)
+Twice (ctx): 2.780000 0.010000 2.790000 ( 2.839568)
-n = 100_000
+jruby -O -J-server 1.0.2
user system total real
-Ordinary: 0.040000 0.000000 0.040000 ( 0.040648)
-Once (w/o): 0.610000 0.000000 0.610000 ( 0.613713)
-Once (ctx): 1.660000 0.000000 1.660000 ( 1.689277)
-Twice (w/o): 0.610000 0.000000 0.610000 ( 0.608093)
-Twice (ctx): 1.870000 0.010000 1.880000 ( 1.918604)
-Wrapped (w/o): 0.600000 0.000000 0.600000 ( 0.605630)
-Wrapped (ctx): 2.960000 0.010000 2.970000 ( 2.979563)
-All wrappers (ctx): 3.750000 0.000000 3.750000 ( 3.761805)
+Ordinary: 0.108000 0.000000 0.108000 ( 0.108000)
+Once (w/o): 2.336000 0.000000 2.336000 ( 2.335000)
+Once (ctx): 3.390000 0.000000 3.390000 ( 3.390000)
+Twice (w/o): 2.439000 0.000000 2.439000 ( 2.439000)
+Twice (ctx): 5.191000 0.000000 5.191000 ( 5.190000)
@@ -40,7 +40,7 @@ def reveal(name)
instance_methods.each { |m| hide(m) }
- def method_missing(method_name, *rest_args, &block)
+ def method_missing(method_name, *rest_args)
yield(:next, *rest_args)
end
end
@@ -1,8 +1,8 @@
module ContextR #:nodoc:
module VERSION #:nodoc:
MAJOR = 0
- MINOR = 2
- TINY = 0
+ MINOR = 1
+ TINY = 9
STRING = [MAJOR, MINOR, TINY].join('.')
end
@@ -1,12 +1,108 @@
+gem "literate_maruku"
require "literate_maruku"
+require 'markaby'
+require 'active_support'
+
+class Fixnum
+ def ordinal
+ # teens
+ return 'th' if (10..19).include?(self % 100)
+ # others
+ case self % 10
+ when 1: return 'st'
+ when 2: return 'nd'
+ when 3: return 'rd'
+ else return 'th'
+ end
+ end
+end
+
+class Time
+ def pretty
+ return "#{mday}#{mday.ordinal} #{strftime('%B')} #{year}"
+ end
+end
module LiterateMarukuTest
BASE_DIR = File.dirname(__FILE__) + "/../"
TARGET_DIR = File.dirname(__FILE__) + "/../../website/test/"
def self.load(file)
- LiterateMaruku.require(BASE_DIR + "#{File.basename(file, '.rb')}.mkd",
- :output => TARGET_DIR,
- :attributes => {:execute => true})
+ content = LiterateMaruku.require(
+ BASE_DIR + "#{File.basename(file, '.rb')}.mkd",
+ :inline => true,
+ :attributes => {:execute => true})
+
+ download = "http://rubyforge.org/projects/contextr"
+ version = ContextR::VERSION::STRING
+ modified = Time.now
+ sub_title = File.basename(file, '.rb').gsub("test_", "").titleize
+
+ doc = Markaby::Builder.new.xhtml_strict do
+ head do
+ title "ContextR - #{sub_title} - Documentation"
+ link :href => "../stylesheets/screen.css", :rel=>'stylesheet',
+ :type=>'text/css', :media => "screen"
+ script :src => "../javascripts/rounded_corners_lite.inc.js",
+ :type =>"text/javascript"
+ script %Q{
+ window.onload = function() {
+ settings = {
+ tl: { radius: 10 },
+ tr: { radius: 10 },
+ bl: { radius: 10 },
+ br: { radius: 10 },
+ antiAlias: true,
+ autoPad: true,
+ validTags: ["div"]
+ }
+ var versionBox = new curvyCorners(settings,
+ document.getElementById("version"));
+ versionBox.applyCornersToAll();
+ }
+ }, :type => "text/javascript"
+ end
+ body do
+ div.main! do
+ h1 sub_title
+ div.version! :class => "clickable",
+ :onclick => "document.location='#{download}'; return false" do
+ p "Get Version"
+ a version, :href => download, :class => "numbers"
+ end
+ h1 do
+ self << "&#x2192; &#8216;"
+ a "contextr", :href => "http://contextr.rubyforge.org/"
+ self << "&#8217;"
+ end
+
+ ul.navi! do
+ Dir[File.dirname(file) + "/test_*.mkd"].each do |mkd_file_name|
+ li do
+ name = File.basename(mkd_file_name, ".mkd").gsub("test_", "")
+ a name.titleize, :href => name + ".html"
+ end
+ end
+ end
+
+ self << content
+ p.coda do
+ text modified.pretty
+ br
+ text "Theme extended from "
+ a "Paul Battley", :href => "http://rb2js.rubyforge.org/"
+ end
+ end
+ end
+ end
+ File.open(TARGET_DIR +
+ "#{File.basename(file, '.rb').gsub("test_", "")}.html", "w") do |f|
+ f.puts(%q{<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">})
+ doc.to_s.each do |chunk|
+ f.puts(chunk)
+ end
+ end
end
end
@@ -6,11 +6,6 @@ I tried to improve it by defining a little helper method called `step`. It shall
test if all chunks are executed in the expected order and additionally check
if the expected layers are activated.
- def step(index, *layers)
- $step ||= 0
- assert_equal(index, $step += 1)
- assert_equal(layers, ContextR::active_layers)
- end
Layer activation shall be dynamically scoped. This is basically no problem, but
it gets messy when doing thread programming and switching between scopes. The
@@ -23,31 +18,43 @@ As you may see, leaving the inner block in step 5 results in the "lost" layer
the rest is support code.
example do
+ def step(index, *layers)
+ @step ||= 0
+ assert_equal(index, @step += 1) if index
+ assert_equal(layers, ContextR::active_layers)
+ end
+
mutex = Mutex.new
+ one_block = lambda do
+ mutex.lock
+ ContextR::with_layer :b do
+ step(3, :a, :b)
+ mutex.unlock
+ sleep(0.1)
+ mutex.lock
+ step(5, :a, :b)
+ end
+ end
+
+ two_block = lambda do
+ mutex.lock
+ step(4, :a)
+ mutex.unlock
+ end
+
step(1)
ContextR::with_layer :a do
step(2, :a)
- a = Thread.new do
- mutex.lock
- ContextR::with_layer :b do
- step(3, :a, :b)
- mutex.unlock
- sleep(0.1)
- mutex.lock
- step(5, :a, :b)
- end
- end
+ one = Thread.new(&one_block)
+ two = Thread.new(&two_block)
+
+ step(nil, :a)
- b = Thread.new do
- mutex.lock
- step(4, :a)
- mutex.unlock
- end
+ one.join
+ two.join
- a.join
- b.join
step(6, :a)
end
step(7)
@@ -29,10 +29,10 @@ This could mean print the university a student belongs to or attach the
address to the output.
Additonal methods
-=================
+-----------------
In a plain old Ruby project, this would result in additional methods,
-propably encapsulated in modules, that will be included into our classes.
+probably encapsulated in modules, that will be included into our classes.
This allows reuse and better encapsulation.
module AddressOutput
@@ -59,8 +59,8 @@ instead of to\_s if you would like to have additional information.
end
end
-The same for each student. #to\_s\_with\_unversity and
-#to\_s\_with\_university\_and\_address give as well additional output.
+The same for each student. #to\_s\_with\_unversity
+and #to\_s\_with\_university\_and\_address give as well additional output.
So how can you use it. Let's create some instances first.
@@ -69,13 +69,13 @@ So how can you use it. Let's create some instances first.
An now some output.
-**Note**: This could live inside an erb template, a graphical
-ui or printed to the command line. In all these cases to\_s is called
-automatically by the standard libary to receive a good representation of
+**Note**: This could live inside an erb template, a graphical user
+interface or printed to the command line. In all these cases to\_s is called
+automatically by the standard library to receive a good representation of
the object.
The output method defined in test\_helper.rb simulates this behaviour. All
examples are converted to test class automatically, so we can be sure, that
-this document stays in sync with the libary.
+this document stays in sync with the library.
puts $gregor # => prints "Gregor"
"#{$gregor}" # => evaluates to "Gregor"
@@ -92,14 +92,14 @@ Assume, we would like to print an address list now.
output_of($gregor.to_s_with_address) == "Gregor (Berlin)"
end
-If you want a list with university and addresses, you would use
-#to\_s\_with\_university\_and\_address. No automatic call to to\_s anymore. If
-you have your layout in an erb template, you have to change each and every
+If you want a list with university and addresses, you would
+use #to\_s\_with\_university\_and\_address. No automatic call to to\_s anymore.
+If you have your layout in an erb template, you have to change each and every
occurrence of your variables.
Redefining to\_s
-===============
+---------------
To solve this problem you could redefine to\_s on demand. I will demonstrate
this with some meta programming in a fresh class.
@@ -180,7 +180,7 @@ thread safe solution.
ContextR
-========
+--------
This is were context-oriented programming comes into play. I will again
start from the scratch. It is not much and we all know the problem space
@@ -311,7 +311,11 @@ deactivate layers again.
end
end
-These encaspulations may be as complex as your application. ContextR will
+ example do
+ assert_equal(["to_s"], Religion.in_layer(:location).instance_methods)
+ end
+
+These encapsulations may be as complex as your application. ContextR will
keep track of all activations and deactivations within the blocks and
restore the settings after the block was executed.
@@ -0,0 +1,21 @@
+ContextR knows two basic reflection mechanisms. One is to query the currently
+active layers.
+
+ example do
+ ContextR::with_layer :a do
+ assert_equal([:a], ContextR::active_layers)
+ ContextR::with_layer :b do
+ assert_equal([:a, :b], ContextR::active_layers)
+ end
+ assert_equal([:a], ContextR::active_layers)
+ end
+ end
+
+The second is to query all layers, that where ever defined.
+
+ example do
+ assert(ContextR::layers.include?(:a))
+ assert(ContextR::layers.include?(:b))
+ end
+
+
@@ -1,4 +1,4 @@
require File.dirname(__FILE__) + "/test_helper.rb"
-test_class(:TestYieldNext)
+test_class(:TestMetaApi)
LiterateMarukuTest.load(__FILE__)
Oops, something went wrong.

0 comments on commit eff7896

Please sign in to comment.