19. RSPEC
Behaviour Driven Development
Describe a network interface!
It should have a host address.
It should have a network address.
It should have a gateway address.
The gateway and the host address must be in the same network.
20. RSPEC
describe Interface do
it “should have a host address” do
end
Behaviour Driven Development it “should have a network address” do
end
it “should have a gateway address” do
end
Describe a network interface!
it “gateway and host address...” do
It should have a host address. end
It should have a network address. end
It should have a gateway address.
The gateway and the host address must be in the same network.
21. RSPEC
describe Interface do
before :all do
@interface = Interface.new
end
before :each do
@interface.network = “10.30.0.0”
end
it “should have a host address” do
@interface.should respond_to :host
end
it “should be valid” do
# Rails model validation
@interface.should be_valid
end
after :each do
#do something
end
end
22. RSPEC
describe Interface do
describe :network
subject { @interface.network }
context “when netmask is 255.255.0.0” do
before { @interface.netmask = “255.255.0.0” }
it { should =~ /0.0$/}
end
context “when netmask is 255.0.0.0” do
before { @interface.netmask = “255.0.0.0” }
it { should =~ /0.0.0$/}
end
context “when gateway and host are not in the same network” do
# network address is 10.30.0.0/255.255.0.0 currently
before { @interface.gateway = “10.100.255.254” }
it { should =~ /^10.100/ }
specify { @interface.should not.be_valid }
end
end
end
23. RSPEC
Interface
network
when netmask is 255.255.0.0
should =~ /0.0$/
when netmask is 255.0.0.0
should =~ /0.0.0$/
when gateway and host are not in the same network
should =~ /^10.100/
should not be valid
expected: /0.0$/,
got: "10.30.0.1" (using =~)
Diff:
@@ -1,2 +1,2 @@
-/0.0$/
+"10.30.0.1"
25. Cucumber
Precondition Given
Action When
Postcondition Then
26. Cucumber
Feature: Network Connection
Managing network connections on intraweb
Scenario: Interface settings
Given an Interface
and its address is 10.30.0.34
and its network is 10.30.0.0
When the gateway is 10.100.255.254
Then its not valid
27. Cucumber
Feature: Network Connection
Managing network connections on intraweb
Scenario: Interface settings
Given an Interface
and its address is <IP>
and its network is <NETWORK>
When the gateway is <GATEWAY>
Then its <RESULT>
Examples:
| IP | NETWORK | GATEWAY | RESULT |
| 10.30.0.34 | 10.30.0.0 | 10.30.255.254 | VALID |
| 10.100.30.1 | 10.100.0.0 | 10.30.255.254 | NOT VALID |
28. Cucumber
Given an Interface
and its address is <IP>
and its network is <NETWORK>
Given /^an Interface$/ do
@interface = Interface.new
end
Given /address is (.*)$/ do |value|
@interface.address = value
end
Given /network is (.*)$/ do |value|
@interface.network = value
end
29. Cucumber
When the gateway is <GATEWAY>
Then its <RESULT>
When /^the gateway is (.*)$/ do |gw|
@interface.gateway = gw
end
Then /its (.*)$/ do |result|
@interface.validate.should == (result == “VALID”)
end
30. Cucumber
Jellemző: Összeadás
Azért, hogy elkerüljem a buta hibákat
amit diszkalkúliásként elkövethetek,
két szám összegét szeretném kiszámoltatni.
Forgatókönyv vázlat: Két szám összeadása
Amennyiben beütök a számológépbe egy <be_1>-est
És beütök a számológépbe egy <be_2>-est
Majd megnyomom az <gomb> gombot
Akkor eredményül <ki>-t kell kapnom
Példák:
| be_1 | be_2 | gomb | ki |
| 20 | 30 | add | 50 |
| 2 | 5 | add | 7 |
| 0 | 40 | add | 40 |
by gbence
31. Cucumber
Before do
@calc = Calculator.new
end
Ha /^beütök a számológépbe egy (d+)-(?:es|as|ös|ás)t$/ do |n|
@calc.push n.to_i
end
Majd /^megnyomom az (w+) gombot$/ do |op|
@result = @calc.send op
end
Akkor /^eredményül (.*)-(?:e|a|ö|á|)t kell kapnom$/ do |result|
@result.should == result.to_f
end
32. Cucumber
OH HAI: STUFFING
MISHUN: CUCUMBR
I CAN HAZ IN TEH BEGINNIN 3 CUCUMBRZ
WEN I EAT 2 CUCUMBRZ
DEN I HAS 2 CUCUMBERZ IN MAH BELLY
AN IN TEH END 1 CUCUMBRZ KTHXBAI
ICANHAZ /^IN TEH BEGINNIN (d+) CUCUMBRZ$/ do |n|
@basket = Basket.new(n.to_i)
end
WEN /^I EAT (d+) CUCUMBRZ$/ do |n|
@belly = Belly.new
@belly.eat(@basket.take(n.to_i))
end
40. Ruby C
main.c
#include "ruby.h" class Test
static VALUE t_init(VALUE self) def initialize
{ @array = Array.new
VALUE array; end
array = rb_ary_new(); def add(anObject)
rb_iv_set(self, "@array", array); @array.push(anObject)
return self; end
}
end
static VALUE t_add(VALUE self, VALUE anObject)
{
VALUE array;
array = rb_iv_get(self, "@array");
rb_ary_push(array, anObject);
return array;
}
...
41. Ruby C
main.c
/* from the previous slide */ class Test
static VALUE t_init(VALUE self);
static VALUE t_add(VALUE self, VALUE anObject); def initialize
/* end */ @array = Array.new
end
VALUE cTest; def add(anObject)
@array.push(anObject)
void Init_Test() end
{
cTest = rb_define_class("Test", rb_cObject); end
rb_define_method(cTest, "initialize", t_init, 0);
rb_define_method(cTest, "add", t_add, 1);
}
42. Ruby C
extconf.rb
require 'mkmf'
create_makefile("Test")
nucc@rubybox ~ $ ruby extconf.rb
nucc@rubybox ~ $ make
nucc@rubybox ~ $ make install
43. Ruby C
my_test.rb
require “Test”
test = Test.new
test.add("Balabit Meetup")
p test
=> #<Test:0x100156548 @array=["Balabit Meetup"]>