module fuzzyd_test;

import std.stdio;
import std.algorithm;
import std.algorithm.comparison : equal;

import fuzzyd;

Result[] prepare(string s) {
  string[] source = ["cd Documents",
                     "curl localhost/foo",
                     "cp bar ../foo",
                     "rm -rf Downloads",
                     "vi ~/Documents"];
  return fuzzy(source)(s);
}

@("Matches in expected order")
unittest {
  auto result = prepare("docts").map!(x => x.value);
  auto expected = ["cd Documents",
                   "vi ~/Documents",
                   "curl localhost/foo",
                   "rm -rf Downloads",
                   "cp bar ../foo"];
  assert(equal(expected, result));
}

@("Matches indexes")
unittest {
  auto result = prepare("docts")[0].matches;
  auto expected = [0, 1, 3, 4, 5, 10, 11];
  assert(equal(expected, result));
}

@("Start bonus is applied")
unittest {
  auto result = prepare("curl")[0].score;
  assert(61 == result);
}

@("Case bonus is applied")
unittest {
  auto r1 = prepare("docts")[0].score;
  auto r2 = prepare("Docts")[0].score;
  assert(r1 == 27);
  assert(r2 == 34);
}

@("Word boundary bonus is applied")
unittest {
  auto result = prepare("cd")[0].score;
  assert(14 == result);
}