// Path: src/main/java/util/BestMatcher.java
// public class BestMatcher {
// 
//     private String base;
//     private String[] pattern;
//     private List<Requestable> bestMatches;
//     private int bestPoint;
// 
//     public BestMatcher(String base){
//         this.base = Normalizer.normalize(base.trim(), Normalizer.Form.NFD)
//                 .replaceAll("\\p{InCombiningDiacriticalMarks}+", "")
//                 .toLowerCase();
//         this.pattern = this.base.split("\\s+");
//         bestMatches = new ArrayList<>();
//         bestPoint = 0;
//     }
// 
//     public void evaluate(Requestable proposal){
//         int points = 0;
//         String key = Normalizer.normalize(proposal.getName().trim(), Normalizer.Form.NFD)
//                 .replaceAll("\\p{InCombiningDiacriticalMarks}+", "").toLowerCase();
// 
//         if (! key.equals(base)) {
//             for (String base : pattern)
//                 if (key.contains(base))
//                     points++;
// 
//             if (points > bestPoint) {
//                 bestMatches.clear();
//                 bestMatches.add(proposal);
//                 bestPoint = points;
//             } else if (points == bestPoint)
//                 bestMatches.add(proposal);
//         }
//         else {
//             bestMatches.clear();
//             bestMatches.add(proposal);
//             bestPoint = Integer.MAX_VALUE;
//         }
//     }
// 
//     public void evaluateAll(List<Requestable> proposals){
//         for(Requestable proposal : proposals)
//             evaluate(proposal);
//     }
// 
//     public void evaluateAll(Requestable... proposals){
//         for(Requestable proposal : proposals)
//             evaluate(proposal);
//     }
// 
//     public boolean isUnique(){
//         return bestMatches.size() == 1;
//     }
// 
//     public boolean isEmpty(){
//         return bestMatches.isEmpty();
//     }
// 
//     public List<Requestable> getBests(){
//         return bestMatches;
//     }
// 
// 
//     public Requestable getBest(){
//         if (isUnique())
//             return bestMatches.get(0);
//         else
//             return null;
//     }
// }
// 
// Path: src/main/java/util/Requestable.java
// public class Requestable {
// 
//     private String name;
//     private String url;
// 
//     public Requestable(String name, String url){
//         this.name = name;
//         this.url = url;
//     }
// 
//     @Override
//     public String toString(){
//         return name;
//     }
// 
//     public String getName(){
//         return name;
//     }
// 
//     public String getUrl(){
//         return url;
//     }
// }


import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import util.BestMatcher;
import util.Requestable;
import java.util.ArrayList;
import static org.junit.jupiter.api.Assertions.*;



/**
 * Created by steve on 08/11/2016.
 */
class BestMatcherTest {

    private BestMatcher collection;

    @BeforeEach
    void init(){
        collection = new BestMatcher("test");
    }

    @AfterEach
    void end(){
        collection = null;
    }

    @Test
    void testEmptySize(){
        assertTrue(collection.isEmpty());
        assertTrue(collection.getBests().isEmpty());
        assertNull(collection.getBest());
        assertFalse(collection.isUnique());
    }

    @Test
    void testOneElement(){
// Path: src/main/java/util/BestMatcher.java
// public class BestMatcher {
// 
//     private String base;
//     private String[] pattern;
//     private List<Requestable> bestMatches;
//     private int bestPoint;
// 
//     public BestMatcher(String base){
//         this.base = Normalizer.normalize(base.trim(), Normalizer.Form.NFD)
//                 .replaceAll("\\p{InCombiningDiacriticalMarks}+", "")
//                 .toLowerCase();
//         this.pattern = this.base.split("\\s+");
//         bestMatches = new ArrayList<>();
//         bestPoint = 0;
//     }
// 
//     public void evaluate(Requestable proposal){
//         int points = 0;
//         String key = Normalizer.normalize(proposal.getName().trim(), Normalizer.Form.NFD)
//                 .replaceAll("\\p{InCombiningDiacriticalMarks}+", "").toLowerCase();
// 
//         if (! key.equals(base)) {
//             for (String base : pattern)
//                 if (key.contains(base))
//                     points++;
// 
//             if (points > bestPoint) {
//                 bestMatches.clear();
//                 bestMatches.add(proposal);
//                 bestPoint = points;
//             } else if (points == bestPoint)
//                 bestMatches.add(proposal);
//         }
//         else {
//             bestMatches.clear();
//             bestMatches.add(proposal);
//             bestPoint = Integer.MAX_VALUE;
//         }
//     }
// 
//     public void evaluateAll(List<Requestable> proposals){
//         for(Requestable proposal : proposals)
//             evaluate(proposal);
//     }
// 
//     public void evaluateAll(Requestable... proposals){
//         for(Requestable proposal : proposals)
//             evaluate(proposal);
//     }
// 
//     public boolean isUnique(){
//         return bestMatches.size() == 1;
//     }
// 
//     public boolean isEmpty(){
//         return bestMatches.isEmpty();
//     }
// 
//     public List<Requestable> getBests(){
//         return bestMatches;
//     }
// 
// 
//     public Requestable getBest(){
//         if (isUnique())
//             return bestMatches.get(0);
//         else
//             return null;
//     }
// }
// 
// Path: src/main/java/util/Requestable.java
// public class Requestable {
// 
//     private String name;
//     private String url;
// 
//     public Requestable(String name, String url){
//         this.name = name;
//         this.url = url;
//     }
// 
//     @Override
//     public String toString(){
//         return name;
//     }
// 
//     public String getName(){
//         return name;
//     }
// 
//     public String getUrl(){
//         return url;
//     }
// }


// Path: src/test/java/BestMatcherTest.java
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import util.BestMatcher;
import util.Requestable;
import java.util.ArrayList;
import static org.junit.jupiter.api.Assertions.*;




/**
 * Created by steve on 08/11/2016.
 */
class BestMatcherTest {

    private BestMatcher collection;

    @BeforeEach
    void init(){
        collection = new BestMatcher("test");
    }

    @AfterEach
    void end(){
        collection = null;
    }

    @Test
    void testEmptySize(){
        assertTrue(collection.isEmpty());
        assertTrue(collection.getBests().isEmpty());
        assertNull(collection.getBest());
        assertFalse(collection.isUnique());
    }

    @Test
    void testOneElement(){
        Requestable requestable = new Requestable("test", "http://test.tst");