require 'rubygems'  # poor people still on 1.8
gem 'redis', '>= 3.0.0'
require 'redis'

$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
require 'bacon'
Bacon.summary_at_exit
if $0 =~ /\brspec$/
  raise "\n===\nThese tests are in bacon, not rspec.  Try: bacon #{ARGV * ' '}\n===\n"
end

REDIS_CLASS_NAMES = [:Counter, :HashKey, :List, :Lock, :Set, :SortedSet, :Value]

UNIONSTORE_KEY = 'test:unionstore'
INTERSTORE_KEY = 'test:interstore'
DIFFSTORE_KEY  = 'test:diffstore'

# Start our own redis-server to avoid corrupting any others
REDIS_BIN  = 'redis-server'
REDIS_PORT = ENV['REDIS_PORT'] || 9212
REDIS_HOST = ENV['REDIS_HOST'] || 'localhost'
REDIS_PID  = 'redis.pid'  # can't be absolute
REDIS_DUMP = 'redis.rdb'  # can't be absolute
REDIS_RUNDIR = File.dirname(__FILE__)

if !(defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby")
  describe 'redis-server' do
    it "starting redis-server on #{REDIS_HOST}:#{REDIS_PORT}" do
      fork_pid = fork do
        system "cd #{REDIS_RUNDIR} && (echo port #{REDIS_PORT}; echo logfile /dev/null; echo daemonize yes; echo pidfile #{REDIS_PID}; echo dbfilename #{REDIS_DUMP}; echo databases 32) | #{REDIS_BIN} -"
      end
      fork_pid.should > 0
      sleep 2
    end
  end

  at_exit do
    pidfile = File.expand_path REDIS_PID,  REDIS_RUNDIR
    rdbfile = File.expand_path REDIS_DUMP, REDIS_RUNDIR
    pid = File.read(pidfile).to_i
    puts "=> Killing #{REDIS_BIN} with pid #{pid}"
    Process.kill "TERM", pid
    Process.kill "KILL", pid
    File.unlink pidfile
    File.unlink rdbfile if File.exists? rdbfile
  end
end

def raises_exception(&block)
  e = nil
  begin
    block.call
  rescue => e
  end
  e.should.be.is_a?(StandardError)
end

# Grab a global handle
REDIS_HANDLE = Redis.new(:host => REDIS_HOST, :port => REDIS_PORT)
#$redis = REDIS_HANDLE
Redis.current = REDIS_HANDLE

SORT_ORDER = {:order => 'desc alpha'}
SORT_LIMIT = {:limit => [2, 2]}
SORT_BY    = {:by => 'm_*'}
SORT_GET   = {:get => 'spec/*/sorted'}.merge!(SORT_LIMIT)
SORT_STORE = {:store => "spec/aftersort"}.merge!(SORT_GET)
