require 'spec_helper'

RSpec::Matchers.define :be_solved do
  match do |actual|
    !actual.match("Congratulations, you have solved the level!").nil?
  end
end

def skip_level
  Githug::Profile.load.level_bump
  `githug reset`
end


describe "The Game" do


  before(:all) do
    @dir = Dir.pwd
    `rake build`
    `gem install pkg/githug-#{Githug::VERSION}.gem`
    FileUtils.rm_rf("/tmp/git_hug")
    Dir.chdir("/tmp")
    `echo "y" | githug`
    Dir.chdir("/tmp/git_hug")
  end

  after(:all) do
    Dir.chdir(@dir)
  end

  it "solves the init level" do
    `git init`
    `githug`.should be_solved
  end

  it "solves the config level" do
    skip_level #The CI server does not have git config set
    #full_name = `git config --get user.name`.chomp
    #email = `git config --get user.email`.chomp
    #f = IO::popen('githug', 'w')
    #f.puts(full_name)
    #f.puts(email)
    #f.close
  end

  it "solves the add level" do
    `git add README`
    `githug`.should be_solved
  end

  it "solves the commit level" do
    `git commit -m "test message"`
    `githug`.should be_solved
  end

  it "solves the clone level" do
    `git clone https://github.com/Gazler/cloneme`
    `githug`.should be_solved
  end

  it "solves the clone_to_folder level" do
    `git clone https://github.com/Gazler/cloneme my_cloned_repo`
    `githug`.should be_solved
  end

  it "solves the ignore level" do
    `echo "*.swp" >> .gitignore`
    `githug`.should be_solved
  end

  it "solves the include level" do
    `echo "*.a\n!lib.a" >> .gitignore`
    `githug`.should be_solved
  end

  it "solves the status level" do
    `git ls-files --other --exclude-standard | githug`.should be_solved
  end

  it "solves the number of files committed level" do
    `git diff --name-only --cached | wc -l | githug`.should be_solved
  end

  it "solves the rm level" do
    file_name = `git status | grep deleted | cut -d " " -f 5`
    `git rm #{file_name}`
    `githug`.should be_solved
  end

  it "solves the rm cached level" do
    file_name = `git status | grep "new file" | cut -d " " -f 5`
    `git rm --cached #{file_name}`
    `githug`.should be_solved
  end

  it "solves the stash level" do
    `git stash save`
    `githug`.should be_solved
  end

  it "solves the rename level" do
    `git mv oldfile.txt newfile.txt`
    `githug`.should be_solved
  end

  it "solves the restructure level" do
    `mkdir src`
    `git mv *.html src`
    `githug`.should be_solved
  end

  it "solves the log level" do
    `git log --pretty=short | grep commit | cut -c 8-14 | githug`.should be_solved
  end

  it "solves the tag level" do
    `git tag new_tag`
    `githug`.should be_solved
  end

  it "solves the push_tags level" do
    `git push origin master --tags`
    `githug`.should be_solved
  end

  it "solves the commit_amend level" do
    `git add forgotten_file.rb`
    `git commit --amend -C HEAD`
    `githug`.should be_solved
  end

  it "solves the commit_in_future level" do
    authored_date = Time.now + 14
    authored_date = authored_date.rfc2822

    `git commit -m "Test of future date" --date="#{authored_date}"`
    `githug`.should be_solved
  end

  it "solves the reset level" do
    `git reset HEAD to_commit_second.rb`
    `githug`.should be_solved
  end

  it "solves the reset_soft level" do
    `git reset --soft HEAD^`
    `githug`.should be_solved
  end

  it "solves the checkout_file level" do
    `git checkout -- config.rb`
    `githug`.should be_solved
  end

  it "solves the remove level" do
    `git remote | githug`.should be_solved
  end

  it "solves the remote_url level" do
    `git remote -v | tail -2 | head -1 | cut -c 17-52 | githug`.should be_solved
  end

  it "solves the pull level" do
    `git pull origin master`
    `githug`.should be_solved
  end

  it "solves the remote_add level" do
    `git remote add origin https://github.com/githug/githug`
    `githug`.should be_solved
  end

  it "solves the push level" do
    `git rebase origin/master`
    `git push origin`
    `githug`.should be_solved
  end

  it "solves the diff level" do
    `echo "26" | githug`.should be_solved
  end

  it "solves the blame level" do
    `echo "spider man" | githug`.should be_solved
  end

  it "solves the branch level" do
    `git branch test_code`
    `githug`.should be_solved
  end

  it "solves the checkout level" do
    `git checkout -b my_branch`
    `githug`.should be_solved
  end

  it "solves the checkout_tag level" do
    `git checkout v1.2`
    `githug`.should be_solved
  end

  it "solves the checkout_tag_over_branch level" do
    `git checkout tags/v1.2`
    `githug`.should be_solved
  end

  it "solves the branch_at level" do
    commit = `git log HEAD~1 --pretty=short | head -1 | cut -d " " -f 2`
    `git branch test_branch #{commit}`
    `githug`.should be_solved
  end

  it "solves the delete_branch level" do
    `git branch -d delete_me`
    `githug`.should be_solved
  end

  it "solves the push_branch level" do
    `git push origin test_branch`
    `githug`.should be_solved
  end

  it "should commit the merge level" do
    `git merge feature`
    `githug`.should be_solved
  end

  it "solves the fetch level" do
    `git fetch`
    `githug`.should be_solved
  end

  it "solves the rebase level" do
    `git checkout feature`
    `git rebase master`
    `githug`.should be_solved
  end

  it "solves the rebase_onto level" do
    `git checkout readme-update`
    `git rebase --onto master wrong_branch readme-update`
    `githug`.should be_solved
  end

  it "solves the repack level" do
    `git repack -d`
    `githug`.should be_solved
  end

  it "solves the cherry-pick level" do
    commit = `git log new-feature --oneline  -n 3 | tail -1 | cut -d " " -f 1`
    `git cherry-pick #{commit}`
    `githug`.should be_solved
  end

  it "solves the grep level" do
    `echo "4" | githug`.should be_solved
  end

  it "solves the rename_commit level" do
    skip_level
  end

  it "solves the squash level" do
    skip_level
  end

  it "solves the merge squash level" do
    `git merge --squash long-feature-branch`
    `git commit -m "Merged Long Feature Branch"`
    `githug`.should be_solved
  end

  it "solves the reorder level" do
    skip_level
  end

  it "solves the bisect level" do
    `echo "18ed2ac" | githug`.should be_solved
  end

  it "solves the stage_lines level" do
    skip_level
  end

  it "solves the find_old_branch level" do
    `git checkout solve_world_hunger`
    `githug`.should be_solved
  end

  it "solves the revert level" do
    sleep 1
    `git revert HEAD~1 --no-edit`
    `githug`.should be_solved
  end

  it "solves the restore level" do
    `git reflog | grep "Restore this commit" | awk '{print $1}' | xargs git checkout`
    `githug`.should be_solved
  end

  it "solves the conflict level" do
    skip_level
  end

  it "solves the submodule level" do
      `git submodule add https://github.com/jackmaney/githug-include-me`
      `githug`.should be_solved
  end

  it "solves the contribute level" do
    skip_level
  end

end
