require "./spec_helper"
require "../src/cli"

alias FileList = CodePreloader::FileList

describe CodePreloader::FileList do

  it "can be created empty" do
    fl = FileList.new
  end

  it "can be created with a list of directories" do
    fl = FileList.new(["src/", "spec/"])
  end

  it "verifies that initial directories exists" do
    expect_raises(FileList::NotADirectory) do
      fl = FileList.new(["Alice", "Bob"])
    end
  end

  it "can append extra sources" do
    fl = FileList.new()
    fl.add "spec/"
  end

  it "verifies that appended directories exists" do
    fl = FileList.new()
    expect_raises(FileList::NotADirectory) do
      fl.add "Alice"
    end
  end

  it "accept adding reject filters" do
    fl = FileList.new()
    fl.reject { |item| !!(item =~ /name/) }
  end

  it "accept adding select filters" do
    fl = FileList.new()
    fl.select { |item| !!(item =~ /name/) }
  end

  it "enumerates the files" do
    fl = FileList.new()
    fl.add("spec/filelist_data")

    files = Dir["spec/filelist_data/*"]
    fl.each do |file|
      files.should contain(file)
      files = files - [file]
    end
    files.size.should eq(0)
  end

  it "doesn't enumerate duplicate files" do
    fl = FileList.new()
    fl.add("spec/filelist_data")
    fl.add("spec/filelist_data")

    files = [] of String
    fl.each do |file|
      files << file
    end
    files.size.should eq(files.uniq.size)
  end

  it "doesn't enumerate files filtered out by select" do
    fl = FileList.new()
    fl.add("spec/filelist_data")
    fl.select { |path| !!(path =~ /\.c$/) }

    files = Dir["spec/filelist_data/*.c"]
    fl.each do |file|
      files.should contain(file)
      files = files - [file]
    end
    files.size.should eq(0)
  end

  it "doesn't enumerate files filtered out by reject" do
    fl = FileList.new()
    fl.add("spec/filelist_data")
    fl.reject { |path| !!(path =~ /\.txt$/) }

    files = Dir["spec/filelist_data/*.c"]
    fl.each do |file|
      files.should contain(file)
      files = files - [file]
    end
    files.size.should eq(0)

  end

  it "export the files as an array" do
  end

  it "doesn't export duplicate files" do
  end

  it "doesn't export filtered out files" do
  end
end