<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <title>DrugGame with Gosu</title>

  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0"/>

  <link rel="stylesheet" href="/rspec/css/reset.css" type="text/css"/>



  <link type="text/css" href="/rspec/css/fg.menu.css" media="screen" rel="stylesheet" />
  <link type="text/css" href="/rspec/css/theme/ui.all.css" media="screen" rel="stylesheet" />
  <link type="text/css" href="/rspec/css/sh_style.css" rel="stylesheet" />
  <link type="text/css" href="/rspec/css/tipsy.css" rel="stylesheet" />

  <link rel="stylesheet" href="/rspec/css/showoff.css" type="text/css"/>

  <script type="text/javascript" src="/rspec/js/jquery-1.4.2.min.js"></script>
  <script type="text/javascript" src="/rspec/js/jquery.cycle.all.js"></script>
	<script type="text/javascript" src="/rspec/js/jquery-print.js"></script>
  <script type="text/javascript" src="/rspec/js/jquery.batchImageLoad.js"></script>
  <script type="text/javascript" src="/rspec/js/jquery.parsequery.min.js"></script>
  <script type="text/javascript" src="/rspec/js/jquery.doubletap-0.1.js"></script>
  <script type="text/javascript" src="/rspec/js/jquery.tipsy.js"></script>

  <script type="text/javascript" src="/rspec/js/fg.menu.js"></script>
  <script type="text/javascript" src="/rspec/js/showoff.js"></script>
  <script type="text/javascript" src="/rspec/js/jTypeWriter.js"> </script>
  <script type="text/javascript" src="/rspec/js/sh_main.min.js"></script>
  <script type="text/javascript" src="/rspec/js/core.js"></script>
  <script type="text/javascript" src="/rspec/js/showoffcore.js"></script>
  <script type="text/javascript" src="/rspec/js/coffee-script.js"></script>



      <script type="text/javascript" src="/rspec/js/sh_lang/sh_ruby.min.js"></script>





    <link rel="stylesheet" href="/rspec/file/style.css" type="text/css"/>




  <script type="text/javascript">
    $(function(){
      setupPreso(false, './');
    });

    editUrl  = "";
  </script>

</head>

<body>

<a tabindex="0" href="#search-engines" class="fg-button fg-button-icon-right ui-widget ui-state-default ui-corner-all" id="navmenu"><span class="ui-icon ui-icon-triangle-1-s"></span>slides</a>
<div id="navigation" class="hidden"></div>
<a tabindex="1" href="#search-engines" class="fg-button fg-button-icon-right ui-widget ui-state-default ui-corner-all" id="stylemenu"><span class="ui-icon ui-icon-triangle-1-s"></span>styles</a>
<div id="stylepicker" class="hidden"></div>


<div id="help">
  <table>
    <tr><td class="key">z, ?</td><td>toggle help (this)</td></tr>
    <tr><td class="key">space, &rarr;</td><td>next slide</td></tr>
    <tr><td class="key">shift-space, &larr;</td><td>previous slide</td></tr>
    <tr><td class="key">d</td><td>toggle debug mode</td></tr>
    <tr><td class="key">## &lt;ret&gt;</td><td>go to slide #</td></tr>
    <tr><td class="key">c, t</td><td>table of contents (vi)</td></tr>
    <tr><td class="key">f</td><td>toggle footer</td></tr>
    <tr><td class="key">g</td><td>toggle follow</td></tr>
    <tr><td class="key">r</td><td>reload slides</td></tr>
    <tr><td class="key">n</td><td>toggle notes</td></tr>
    <tr><td class="key">p</td><td>run preshow</td></tr>
    <tr><td class="key">P</td><td>toggle pause</td></tr>
    <tr><td class="key">s</td><td>choose style</td></tr>
  </table>
</div>

<div class="buttonNav">
  <input type="submit" onClick="prevStep();" value="prev"/>
  <input type="submit" onClick="nextStep();" value="next"/>
</div>

<div id="preso"><center>loading presentation...</center></div>
<div id="footer">
  <span id="followMode"></span>
  <span id="slideInfo"></span>
  <span id="debugInfo"></span>
  <span id="notesInfo"></span>
  <span id="slideFilename"></span>
  <img id="disconnected" src="/css/disconnected.png" />
</div>

<div id="slides" class="offscreen" style="display:none;">
<div id="one/01_slide" class="slide home" data-transition="scrollLeft"><div class="content home" ref="one/01_slide/1">
<h1>
<span>DrugGame</span> with Gosu</h1>

<h1><span>Rspec</span></h1>

<h2>Krzysztof Kotlarek</h2>

<h3>Twitter: @krzkot</h3>

<h3>Github:  lis2</h3>

<h3>Email:   kotlarek.krzysztof@gmail.com</h3>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/2">
<h1>How<span>?</span>
</h1>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/3">
<h1>Rspec with <span>DrugGame</span>
</h1>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/4">
<h1>Rules</h1>

<p><img src="/rspec/file/one/dwarf.png" alt="dwarf.png"/></p>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/5">
<h1>Rules</h1>

<ul>
<li> <img src="/rspec/file/one/awards/coffeescript.png" alt="main_loop.png"/> - 5 points</li>
<li> <img src="/rspec/file/one/awards/rails.png" alt="main_loop.png"/>         - 7 points</li>
<li> <img src="/rspec/file/one/awards/ruby.png" alt="main_loop.png"/>        - 10 points</li>
<li> <img src="/rspec/file/one/awards/wroclove.png" alt="main_loop.png"/>     - 15 points</li>
<li> <img src="/rspec/file/one/awards/dci.png" alt="main_loop.png"/>         - 1000 points</li>
</ul>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/6">
<h1>Gosu</h1>

<p><span>http://www.libgosu.org/</span></p>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/7">
<h1>Gosu::<span>Window</span>
</h1>

<pre class="sh_ruby"><code>
      require 'gosu'

      class GameWindow &lt; Gosu::Window
        def initialize
        end

        def update
        end

        def draw
        end
      end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/8">
<p><img src="/rspec/file/one/main_loop.png" alt="main_loop.png"/></p>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/9">
<h1>Initialize</h1>

<pre class="sh_ruby"><code>
class GameWindow &lt; Gosu::Window
  def initialize
    super 640, 480, false
    self.caption = "DrugGame"
    @background_image =
      Gosu::Image.new(self, "media/Bg.png")
  end
end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/10">
<h1>Draw</h1>

<pre class="sh_ruby"><code>
  class GameWindow &lt; Gosu::Window
    def draw
      @background_image.draw(0, 0, 0)
    end
  end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/11">
<h1>Player</h1>

<pre class="sh_ruby"><code>
  class Player
    def initialize(window)
      @image =
        Gosu::Image.new(window, "media/player.png")
      @x = @vel_x = @y = @vel_y = 0.0
    end

    def warp(x, y) ; @x, @y = x, y ; end

    def turn_left ; @vel_x -= 4.5 ; end

    def turn_right ; @vel_x += 4.5 ; end

    def move
      @x += @vel_x
      @vel_x *= 0.95
    end

    def draw
      @image.draw_rot(@x, @y, 1, 0)
    end
  end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/12">
<h1>Adding player <span>to window</span>
</h1>

<pre class="sh_ruby"><code>
  class GameWindow &lt; Gosu::Window
    def initialize
      ...
      @player = Player.new(self)
      @player.warp(500, 500)
    end

    def draw
      ...
      @player.draw
    end
  end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/13">
<h1>Keyboard</h1>

<pre class="sh_ruby"><code>
  class GameWindow &lt; Gosu::Window
    def update
      if button_down? Gosu::KbLeft ||
        button_down? Gosu::GpLeft
        @player.turn_left
      end
      if button_down? Gosu::KbRight ||
        button_down? Gosu::GpRight
        @player.turn_right
      end
      @player.move
    end
  end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/14">
<h1>Gravity</h1>

<pre class="sh_ruby"><code>
  class Player
    def set_gravity
      @vy += 1
      if @vy &gt; 0
        @vy.times do
          if would_fit(0, 1)
            @y += 1
          else
            @vy = 0
          end
        end
      end
      (-@vy).times { @y -= 1 } if @vy &lt; 0
    end
  end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/15">
<h1>Jump</h1>

<pre class="sh_ruby"><code>
  class Player
    def jump
      @vy = -20 if @map.solid?(@x, @y, @height)
    end
  end

  class GameWindow &lt; Gosu::Window
    def update
    ...
      if button_down?(Gosu::KbUp) ||
        button_down?(Gosu::GpButton0)
        @player.jump
      end
    end
  end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/16">
<h1>Distance</h1>

<pre class="sh_ruby"><code>
    def collect_awards(awards)
      awards.reject! do |award|
      if Gosu::distance(@x, @y, award.x, award.y) &lt; 50
        @score += award.score
      else
        false
      end
    end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/17">
<h1>Camera</h1>

<pre class="sh_ruby"><code>
    def draw
      translate(-@camera_x, -@camera_y) do
        @player.draw
        @background_image.draw(0, -500, 0)
        @map.draw

        @awards.each { |award| award.draw }
        @monsters.each { |monster| monster.draw }
      end
      @font.draw("Score: #{@player.score}",
        10, 10, 2, 1.0, 1.0, 0xffffff00)
    end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/18">
<h1>Why<span>?</span>
</h1>

<ul>
<li>check <span>your code</span>
</li>
<li>help avoid <span>crappy</span> code</li>
</ul>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/19">
<h1>Rspec or <span>TestUnit?</span>
</h1>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/20">
<h1>Describe and <span>context</span>
</h1>

<pre class="sh_ruby"><code>
  describe DrugGame::GameWindow do

    context "monsters" do
    end

    context "awards" do
      context "score" do
      end
    end
  end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/21">
<h1>Example</h1>

<pre class="sh_ruby"><code>
  describe User do

    it "should have correct first name" do
      user = User.create(first_name: "John", last_name: "Rambo")
      user.first_name.should == "John"
    end

    it "should have correct last name" do
      user = User.create(first_name: "John", last_name: "Rambo")
      user.last_name.should == "Rambo"
    end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/22">
<h1>Matchers</h1>

<pre class="sh_ruby"><code>
  user.name.should eq("John")
  user.name.should == "John"
  user.age.should &gt;= 18
  user.name.should match(/ohn/)
  user.adult.should be_true
  user.friends.should be_empty # empty?</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/23">
<h1>Matchers</h1>

<pre class="sh_ruby"><code>
  def awesome?
    true
  end

  user.should be_awesome</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/24">
<h1>Lambda</h1>

<pre class="sh_ruby"><code>
lambda do
    post :create, :user =&gt; { name: "John" }
end.should change(User, :count).by(1)</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/25">
<h1>Example</h1>

<pre class="sh_ruby"><code>
  describe User do

    it "should have correct first name" do
      user = User.create(first_name: "John", last_name: "Rambo")
      user.first_name.should == "John"
    end

    it "should have correct last name" do
      user = User.create(first_name: "John", last_name: "Rambo")
      user.last_name.should == "Rambo"
    end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/26">
<h1>Let or <span>Let!</span>
</h1>

<pre class="sh_ruby"><code>
  describe User do
    let(:user) { User.create(first_name: "John", last_name: "Rambo") }
    let!(current_user) { ... }

    it "should have correct first name" do
      user.first_name.should == "John"
    end

    it "should have correct last name" do
      user.last_name.should == "Rambo"
    end
  end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/27">
<h1>New syntax</h1>

<pre class="sh_ruby"><code>
  foo.should eq(bar)
  foo.should_not eq(bar)

  expect(foo).to eq(bar)
  expect(foo).not_to eq(bar)</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/28">
<h1>New syntax</h1>

<pre class="sh_ruby"><code>
lambda do
    post :create, :user =&gt; { name: "John" }
end.should change(User, :count).by(1)

expect do
    post :create, :user =&gt; { name: "John" }
end.to change(User, :count).by(1)</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/29">
<h1>stub</h1>

<pre class="sh_ruby"><code>
  Class Claim
    def send_to_ess
      SEND_TO_ESS!!!
    end

    def valid?
      send_to_ess
      return true
    end
  end

  claim.should be_valid</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/30">
<h1>stub</h1>

<pre class="sh_ruby"><code>  Class Claim
    def send_to_ess
      SEND_TO_ESS!!!
    end

    def valid?
      send_to_ess
      return true
    end
  end

  claim.stub(:send_to_ess).and_return(true)
  claim.should be_valid</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/31">
<h1>mock</h1>

<pre class="sh_ruby"><code>
  Class User
    def find_friend
      find if age == 18
    end
  end

  user = double("User, age: 18, gender: male")
  user.should_receive(:find) { user }
  user.find_friend</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/32">
<h1>How<span>?</span>
</h1>

<p><img src="/rspec/file/one/tdd_cycle.jpg" alt="tdd_cycle.jpg"/></p>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/33">
<h1>remove <span>e-mail</span> field</h1>

<p><img src="/rspec/file/one/reg.png" alt="reg.png"/></p>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/34">
<pre class="sh_ruby"><code>
  it "should be valid when email empty" do
    @user = Category.create(name: "Chris", email: "bla@mailinator.com")
    @user.email = ""
    @user.save
    @user.email.should == ""
  end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/35">
<pre class="sh_ruby"><code>  validates_presence_of :email</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/36">
<pre class="sh_ruby"><code>
  it "should be valid when email empty" do
    @user = Category.create(name: "Chris", email: "bla@mailinator.com)
    @user.email = ""
    @user.save
    @user.email.should == ""
  end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/37">
<pre class="sh_ruby"><code>
  it "should be valid when email empty" do
    @user = Category.create(name: "Chris", email: "bla@mailinator.com)
    @user.email = ""
    @user.save
    @user.reload
    @user.email.should == ""
  end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/38">
<h1>Lets test <span>our game</span>
</h1>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/39">
<h1>movable<span>.rb</span>
</h1>

<pre class="sh_ruby"><code>
  def warp(x, y)
    @x, @y = x, y
  end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/40">
<h1>movable_spec<span>.rb</span>
</h1>

<pre class="sh_ruby"><code>
  let(:movable) { DrugGame::Movable.new($window) }

  it "should set position" do
    movable.warp(40, 50)
    movable.x.should == 40
    movable.y.should == 50
  end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/41">
<h1>movable<span>.rb</span>
</h1>

<pre class="sh_ruby"><code>
  def turn_left
    @vel_x = -5
  end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/42">
<h1>movable_spec<span>.rb</span>
</h1>

<pre class="sh_ruby"><code>
  let(:movable) { DrugGame::Movable.new($window) }
  it "should turn left" do
    lambda {
      movable.turn_left
    }.should change(movable, :vel_x).by(-5)
  end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/43">
<h1>movable<span>.rb</span>
</h1>

<pre class="sh_ruby"><code>
  def turn_right
    @vel_x = +5
  end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/44">
<h1>movable_spec<span>.rb</span>
</h1>

<pre class="sh_ruby"><code>
  let(:movable) { DrugGame::Movable.new($window) }

  it "should turn right" do
    lambda {
      movable.turn_right
    }.should change(movable, :vel_x).by(5)
  end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/45">
<h1>game_window<span>.rb</span>
</h1>

<pre class="sh_ruby"><code>
 def update
  @monsters.push(DrugGame::Monster.new(self)) if rand(1000) &lt; 5 &amp;&amp; @monsters.size &lt; 25
  @monsters.each { |monster| monster.move }
  @awards.push(DrugGame::Award.new(self)) if rand(100) &lt; 4 &amp;&amp; @awards.size &lt; 25
  @awards.each { |award| award.move }
  @player.move
  @player.collect_awards(@awards)
  @player.touch_monster(@monsters)
  @camera_x = [[@player.x - self.width/2, 0].max, @map.width - self.width].min
  @camera_y = -[[@height/2 - @player.y, 0].max, height/2].min
end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/46">
<h1>game_window<span>.rb</span>
</h1>

<pre class="sh_ruby"><code>
  def update
    generate_monsters
    generate_awards
    set_player
    set_camera
  end

  def generate_monsters
    @monsters.push(DrugGame::Monster.new(self)) if rand(1000) &lt; 5 &amp;&amp; @monsters.size &lt; 25
    @monsters.each { |monster| monster.move }
  end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/47">
<h1>game_window<span>.rb</span>
</h1>

<pre class="sh_ruby"><code>  context "monsters" do
    it "should not generate monster" do
      lambda {
        $window.stub(:rand).and_return(5)
        $window.generate_monsters
      }.should_not change($window.monsters, :length)
    end

    it "should generate monster" do
      lambda {
        $window.stub(:rand).and_return(3)
        $window.generate_monsters
      }.should change($window.monsters, :length).by(1)
    end
  end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/48">
<h1>validation</h1>

<pre class="sh_ruby"><code>  it "should have valid name" do
    @user = User.create(name: "John")
    @user.name == ""
    @user.should_not be_valid
  end</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/49">
<h1>Shoulda</h1>

<pre class="sh_ruby"><code>
  it { should belong_to(:user) }
  it { should have_many(:tags).through(:taggings) }
  it { should validate_uniqueness_of(:title) }
  it { should validate_uniqueness_of(:title).scoped_to(:user_id) }
  it { should validate_presence_of(:body).with_message(/wtf/) }
  it { should validate_presence_of(:title) }
  it { should validate_numericality_of(:user_id) }
  it { should delegate_method(:work).to(:robot) }</code></pre>
</div>
</div><div id="one/01_slide" class="slide " data-transition="scrollLeft"><div class="content " ref="one/01_slide/50">
<h1>Q &amp; A</h1>
</div>
</div></div>
<div id="pauseScreen">
  PAUSED
</div>

</body>
</html>
