require "spec_helper"
require_dependency "plugin_store"

describe PluginStore do
  def set(k,v)
    PluginStore.set("my_plugin", k, v)
  end

  def get(k)
    PluginStore.get("my_plugin", k)
  end

  def remove_row(k)
    PluginStore.remove("my_plugin", k)
  end

  it "sets strings correctly" do
    set("hello", "world")
    expect(get("hello")).to eq("world")

    set("hello", "world1")
    expect(get("hello")).to eq("world1")
  end

  it "sets fixnums correctly" do
    set("hello", 1)
    expect(get("hello")).to eq(1)
  end

  it "sets bools correctly" do
    set("hello", true)
    expect(get("hello")).to eq(true)

    set("hello", false)
    expect(get("hello")).to eq(false)

    set("hello", nil)
    expect(get("hello")).to eq(nil)
  end


  it "handles hashes correctly" do

    val = {"hi" => "there", "1" => 1}
    set("hello", val)
    result = get("hello")

    expect(result).to eq(val)

    # ensure indiff access holds
    expect(result[:hi]).to eq("there")
  end

  it "handles nested hashes correctly" do

    val = {"hi" => "there", "nested" => {"a" => "b", "with list" => ["a", "b", 3] }}
    set("hello", val)
    result = get("hello")

    expect(result).to eq(val)

    # ensure indiff access holds
    expect(result[:hi]).to eq("there")
    expect(result[:nested][:a]).to eq("b")
    expect(result[:nested]["with list"]).to eq(["a", "b", 3])
  end

  it "handles arrays correctly" do

    val = ["a", "b", {"hash"=> "inside", "c"=> 1}]
    set("hello", val)
    result = get("hello")

    expect(result).to eq(val)

    # ensure indiff access holds
    expect(result[2][:hash]).to eq("inside")
    expect(result[2]["c"]).to eq(1)

  end

  it "removes correctly" do
    set("hello", true)
    remove_row("hello")
    expect(get("hello")).to eq(nil)
  end

end