Sha256: 1fb3eb2ef87b810e64f012fd12e80ce6649d8372a19b15090d4032be6010c170

Contents?: true

Size: 1.34 KB

Versions: 48

Compression:

Stored size: 1.34 KB

Contents

module KernelExit
  extend self
  attr_accessor :status, :original_proc, :proc, :out

  self.original_proc = `Opal.exit`
  self.proc = `function(status){ #{KernelExit.status = `status`} }`

  def out_after_exit
    `Opal.exit = #{proc}`
    exit
    out
  ensure
    `Opal.exit = #{original_proc}`
  end

  def reset!
    self.out = []
  end
end

describe "Kernel.at_exit" do
  before { KernelExit.reset! }

  def print(n)
    KernelExit.out << n
  end

  it "runs after all other code" do
    Kernel.at_exit {print 5}
    print 6

    KernelExit.out_after_exit.should == [6,5]
  end

  it "runs in reverse order of registration" do
    at_exit {print 4}
    at_exit {print 5}
    print 6
    at_exit {print 7}

    KernelExit.out_after_exit.should == [6,7,5,4]
  end

  it "allows calling exit inside at_exit handler" do
    at_exit {print 3}
    at_exit {
      print 4
      exit
      # print 5 # This one is added to out because Opal.exit doesn't actually exit
    }
    at_exit {print 6}

    KernelExit.out_after_exit.should == [6,4,3]
  end

  # INCOMPLETE: the spec implementation is tricky here
  # it "gives access to the last raised exception" do
  #   begin
  #     at_exit do
  #       print $!.message
  #     end
  #     raise 'foo' rescue nil
  #     p [:err, $!]
  #   rescue
  #   end
  #
  #   KernelExit.out_after_exit.should == ['foo']
  # end

end

Version data entries

48 entries across 48 versions & 1 rubygems

Version Path
opal-1.7.4 spec/opal/core/kernel/at_exit_spec.rb
opal-1.7.3 spec/opal/core/kernel/at_exit_spec.rb
opal-1.7.2 spec/opal/core/kernel/at_exit_spec.rb
opal-1.7.1 spec/opal/core/kernel/at_exit_spec.rb
opal-1.7.0 spec/opal/core/kernel/at_exit_spec.rb
opal-1.7.0.rc1 spec/opal/core/kernel/at_exit_spec.rb
opal-1.6.1 spec/opal/core/kernel/at_exit_spec.rb
opal-1.6.0 spec/opal/core/kernel/at_exit_spec.rb
opal-1.6.0.rc1 spec/opal/core/kernel/at_exit_spec.rb
opal-1.6.0.alpha1 spec/opal/core/kernel/at_exit_spec.rb
opal-1.5.1 spec/opal/core/kernel/at_exit_spec.rb
opal-1.5.0 spec/opal/core/kernel/at_exit_spec.rb
opal-1.5.0.rc1 spec/opal/core/kernel/at_exit_spec.rb
opal-1.4.1 spec/opal/core/kernel/at_exit_spec.rb
opal-1.4.0 spec/opal/core/kernel/at_exit_spec.rb
opal-1.4.0.alpha1 spec/opal/core/kernel/at_exit_spec.rb
opal-1.3.2 spec/opal/core/kernel/at_exit_spec.rb
opal-1.3.1 spec/opal/core/kernel/at_exit_spec.rb
opal-1.3.0 spec/opal/core/kernel/at_exit_spec.rb
opal-1.3.0.rc1 spec/opal/core/kernel/at_exit_spec.rb