#!/usr/bin/env ruby
# encoding: UTF-8

# (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
#
#    Licensed under the Apache License, Version 2.0 (the "License");
#    you may not use this file except in compliance with the License.
#    You may obtain a copy of the License at
#
#        http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS,
#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#    See the License for the specific language governing permissions and
#    limitations under the License.

require 'rubygems'
if ENV['RSPEC_DEBUG'] == 'true'
  if /1\.8/ =~ RUBY_VERSION
    require 'ruby-debug'
    Debugger.start
    alias stop debugger # rubocop: disable Style/Alias
  elsif /1\.9/ =~ RUBY_VERSION
    require 'debugger'
    alias stop debugger # rubocop: disable Style/Alias
  else
    require 'byebug'
    alias stop byebug # rubocop: disable Style/Alias
  end
else
  def stop
  end
end

require 'lorj'

# Define some spec addon
module PrcLib
  module_function

  # Attribute app_name
  #
  # app_name is set to 'lorj' if not set.
  #
  def spec_cleanup
    instance_variables.each do |v|
      # @lib_path is set by require 'lorj'. We should never update it.
      # @core_level is set by require 'lorj'. We should never update it.
      next if [:'@lib_path', :'@core_level'].include?(v)
      instance_variable_set(v, nil)
    end
  end

  def to_s
    a = {}
    instance_variables.each do |v|
      a[v] = instance_variable_get(v)
    end
    a
  end
end

# Define some spec addon
module Lorj
  module_function

  # Attribute app_name
  #
  # app_name is set to 'lorj' if not set.
  #
  def spec_cleanup
    instance_variables.each do |v|
      # @lib_path is set by require 'lorj'. We should never update it.
      # @core_level is set by require 'lorj'. We should never update it.
      next if [:'@lib_path', :'@core_level'].include?(v)
      instance_variable_set(v, nil)
    end
  end

  def show_log(lorj_debug = nil)
    return unless ENV['RSPEC_DEBUG'] == 'true'

    env_lorj_debug = ENV['LORJ_DEBUG']
    if lorj_debug.nil? && env_lorj_debug && /[0-9]/ =~ env_lorj_debug
      lorj_debug = ENV['LORJ_DEBUG'].to_i
    end
    PrcLib.core_level = lorj_debug unless lorj_debug.nil?
    PrcLib.level = Logger::DEBUG
  end

  def to_s
    a = {}
    instance_variables.each do |v|
      a[v] = instance_variable_get(v)
    end
    a
  end
end

RSpec.configure do |config|
  config.before(:all, &:silence_output)
  config.after(:all,  &:enable_output)
end

public

# Redirects stderr and stout to /dev/null.txt
def silence_output
  # Store the original stderr and stdout in order to restore them later
  @original_stderr = $stderr
  @original_stdout = $stdout

  # Redirect stderr and stdout
  $stderr = File.open(File.join('', 'dev', 'null'), 'w')
  $stdout = File.open(File.join('', 'dev', 'null'), 'w')
end

# Replace stderr and stdout so anything else is output correctly
def enable_output
  $stderr = @original_stderr
  $stdout = @original_stdout
  @original_stderr = nil
  @original_stdout = nil
end
