| 
<?php
 use Fuse\Fuse;
 
 beforeEach(function () {
 $this->setupFuse = function ($itemList = null, $overwriteOptions = []) {
 $list = $itemList ?? ['Apple', 'Orange', 'Banana'];
 $options = array_merge([], $overwriteOptions);
 
 return new Fuse($list, $options);
 };
 });
 
 describe('Flat list of strings: ["Apple", "Orange", "Banana"]', function () {
 beforeEach(function () {
 $this->fuse = ($this->setupFuse)();
 });
 
 describe('When searching for the term "Apple"', function () {
 beforeEach(function () {
 $this->result = $this->fuse->search('Apple');
 });
 
 test('we get a list of exactly 1 item', function () {
 expect($this->result)->toHaveCount(1);
 });
 
 test('whose value is the index 0, representing ["Apple"]', function () {
 expect($this->result[0]['refIndex'])->toBe(0);
 });
 });
 
 describe('When performing a fuzzy search for the term "ran"', function () {
 beforeEach(function () {
 $this->result = $this->fuse->search('ran');
 });
 
 test('we get a list of containing 2 items', function () {
 expect($this->result)->toHaveCount(2);
 });
 
 test('whose values represent the indices of ["Orange", "Banana"]', function () {
 expect($this->result[0]['refIndex'])->toBe(1);
 expect($this->result[1]['refIndex'])->toBe(2);
 });
 });
 
 describe('When performing a fuzzy search for the term "nan"', function () {
 beforeEach(function () {
 $this->result = $this->fuse->search('nan');
 });
 
 test('we get a list of containing 2 items', function () {
 expect($this->result)->toHaveCount(2);
 });
 
 test('whose values represent the indices of ["Banana", "Orange"]', function () {
 expect($this->result[0]['refIndex'])->toBe(2);
 expect($this->result[1]['refIndex'])->toBe(1);
 });
 });
 
 describe(
 'When performing a fuzzy search for the term "nan" with a limit of 1 result',
 function () {
 beforeEach(function () {
 $this->result = $this->fuse->search('nan', ['limit' => 1]);
 });
 
 test('we get a list of containing 1 item: [2]', function () {
 expect($this->result)->toHaveCount(1);
 });
 
 test('whose values represent the indices of ["Banana", "Orange"]', function () {
 expect($this->result[0]['refIndex'])->toBe(2);
 });
 },
 );
 });
 
 $customBookList = [
 [
 'title' => "Old Man's War",
 'author' => ['firstName' => 'John', 'lastName' => 'Scalzi'],
 ],
 [
 'title' => 'The Lock Artist',
 'author' => ['firstName' => 'Steve', 'lastName' => 'Hamilton'],
 ],
 ['title' => 'HTML5'],
 [
 'title' => 'A History of England',
 'author' => ['firstName' => 1066, 'lastName' => 'Hastings'],
 ],
 ];
 
 describe('Deep key search, with ["title", "author.firstName"]', function () use ($customBookList) {
 beforeEach(function () use ($customBookList) {
 $this->fuse = ($this->setupFuse)($customBookList, [
 'keys' => ['title', 'author.firstName'],
 ]);
 });
 
 describe('When searching for the term "Stve"', function () {
 beforeEach(function () {
 $this->result = $this->fuse->search('Stve');
 });
 
 it('we get a list containing at least 1 item', function () {
 expect(count($this->result))->toBeGreaterThanOrEqual(1);
 });
 
 it('and the first item has the matching key/value pairs', function () {
 expect($this->result[0]['item']['title'])->toEqual('The Lock Artist');
 expect($this->result[0]['item']['author']['firstName'])->toEqual('Steve');
 expect($this->result[0]['item']['author']['lastName'])->toEqual('Hamilton');
 });
 });
 
 describe('When searching for the term "106"', function () {
 beforeEach(function () {
 $this->result = $this->fuse->search('106');
 });
 
 it('we get a list of exactly 1 item', function () {
 expect(count($this->result))->toEqual(1);
 });
 
 it('whose value matches', function () {
 expect($this->result[0]['item']['title'])->toEqual('A History of England');
 expect($this->result[0]['item']['author']['firstName'])->toEqual(1066);
 expect($this->result[0]['item']['author']['lastName'])->toEqual('Hastings');
 });
 });
 });
 
 describe('Searching ignoring diactrictics', function () {
 $list = [['text' => 'déjà'], ['text' => 'cafe']];
 
 $options = [
 'ignoreDiacritics' => true,
 'threshold' => 0,
 'keys' => ['text'],
 ];
 
 $fuse = new Fuse($list, $options);
 
 test('Search: query with diacritics, list with diacritics', function () use ($fuse) {
 $result = $fuse->search('déjà');
 expect($result)->toHaveCount(1);
 expect($result[0]['refIndex'])->toBe(0);
 });
 
 test('Search: query without diacritics, list with diacritics', function () use ($fuse) {
 $result = $fuse->search('deja');
 expect($result)->toHaveCount(1);
 expect($result[0]['refIndex'])->toBe(0);
 });
 
 test('Search: query with diacritics, list without diacritics', function () use ($fuse) {
 $result = $fuse->search('café');
 expect($result)->toHaveCount(1);
 expect($result[0]['refIndex'])->toBe(1);
 });
 
 test('Search: query without diacritics, list without diacritics', function () use ($fuse) {
 $result = $fuse->search('cafe');
 expect($result)->toHaveCount(1);
 expect($result[0]['refIndex'])->toBe(1);
 });
 });
 
 |