package net.thucydides.core.matchers;
import org.hamcrest.Matcher;
import org.hamcrest.MatcherAssert;
import org.junit.Test;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.fest.assertions.Assertions.assertThat;
import static org.hamcrest.Matchers.*;
public class WhenMatchingPropertyValuesWithMaps {
@Test
public void should_match_field_by_name() {
BeanPropertyMatcher matcher = new BeanPropertyMatcher("firstName", is("Bill"));
Map<String, String> person = mappedPerson("Bill", "Oddie");
assertThat(matcher.matches(person)).isTrue();
}
private Map<String,String> mappedPerson(String firstname, String lastname) {
Map<String, String> person = new HashMap<String, String>();
person.put("firstName", firstname);
person.put("lastName", lastname);
return person;
}
@Test
public void should_fail_if_match_is_not_successful() {
BeanPropertyMatcher matcher = new BeanPropertyMatcher("firstName", is("Bill"));
Map<String, String> person = mappedPerson("Graeam", "Garden");
assertThat(matcher.matches(person)).isFalse();
}
@Test
public void should_obtain_matcher_from_fluent_static_method() {
BeanFieldMatcher matcher = (BeanFieldMatcher) BeanMatchers.the("firstName", is("Bill"));
Map<String, String> person = mappedPerson("Bill", "Oddie");
assertThat(matcher.matches(person)).isTrue();
}
@Test
public void should_obtain_instanciated_matcher_from_matcher() {
Matcher<Object> matcher = ((BeanFieldMatcher) BeanMatchers.the("firstName", is("Bill"))).getMatcher();
Map<String, String> person = mappedPerson("Bill", "Oddie");
assertThat(matcher.matches(person)).isTrue();
}
@Test
public void instanciated_matcher_should_provide_meaningful_description() {
Matcher<Object> matcher = ((BeanFieldMatcher) BeanMatchers.the("firstName", is("Bill"))).getMatcher();
assertThat(matcher.toString()).isEqualTo("firstName is 'Bill'");
}
@Test
public void should_filter_list_of_beans_by_matchers() {
List<Map<String, String>> persons = Arrays.asList(mappedPerson("Bill", "Oddie"),
mappedPerson("Graeam", "Garden"),
mappedPerson("Tim", "Brooke-Taylor"));
BeanMatcher firstNameIsBill = BeanMatchers.the("firstName", is("Bill"));
BeanMatcher lastNameIsOddie = BeanMatchers.the("lastName", is("Oddie"));
assertThat(BeanMatcherAsserts.matches(persons, firstNameIsBill, lastNameIsOddie)).isTrue();
}
@Test
public void should_fail_filter_if_no_matching_elements_found() {
List<Map<String,String>> persons = Arrays.asList(mappedPerson("Bill", "Kidd"),
mappedPerson("Graeam", "Garden"),
mappedPerson("Tim", "Brooke-Taylor"));
BeanMatcher firstNameIsBill = BeanMatchers.the("firstName", is("Bill"));
BeanMatcher lastNameIsOddie = BeanMatchers.the("lastName", is("Oddie"));
assertThat(BeanMatcherAsserts.matches(persons, firstNameIsBill, lastNameIsOddie)).isFalse();
}
@Test
public void should_return_matching_element() {
Map<String,String> bill = mappedPerson("Bill", "Oddie");
Map<String,String> graham = mappedPerson("Graeam", "Garden");
Map<String,String> tim = mappedPerson("Tim", "Brooke-Taylor");
List<Map<String,String>> persons = Arrays.asList(bill, graham, tim);
BeanMatcher firstNameIsBill = BeanMatchers.the("firstName", is("Bill"));
BeanMatcher lastNameIsOddie = BeanMatchers.the("lastName", is("Oddie"));
assertThat(BeanMatcherAsserts.filterElements(persons, firstNameIsBill, lastNameIsOddie)).contains(bill);
}
@Test
public void should_return_no_elements_if_no_matching_elements_found() {
Map<String,String> billoddie = mappedPerson("Bill", "Oddie");
Map<String,String> billkidd = mappedPerson("Bill", "Kidd");
Map<String,String> graham = mappedPerson("Graeam", "Garden");
Map<String,String> tim = mappedPerson("Tim", "Brooke-Taylor");
List<Map<String,String>> persons = Arrays.asList(billoddie, billkidd, graham, tim);
BeanMatcher firstNameIsJoe = BeanMatchers.the("firstName", is("Joe"));
assertThat(BeanMatcherAsserts.filterElements(persons, firstNameIsJoe)).isEmpty();
}
@Test
public void should_return_multiple_matching_elements() {
Map<String,String> billoddie = mappedPerson("Bill", "Oddie");
Map<String,String> billkidd = mappedPerson("Bill", "Kidd");
Map<String,String> graham = mappedPerson("Graeam", "Garden");
Map<String,String> tim = mappedPerson("Tim", "Brooke-Taylor");
List<Map<String,String>> persons = Arrays.asList(billoddie, billkidd, graham, tim);
BeanMatcher firstNameIsBill = BeanMatchers.the("firstName", is("Bill"));
assertThat(BeanMatcherAsserts.filterElements(persons, firstNameIsBill)).contains(billkidd, billoddie);
}
@Test
public void should_match_against_a_single_bean() {
Map<String, String> person = mappedPerson("Bill", "Oddie");
BeanMatcher firstNameIsBill = BeanMatchers.the("firstName", is("Bill"));
BeanMatcher lastNameIsOddie = BeanMatchers.the("lastName", is("Oddie"));
assertThat(BeanMatcherAsserts.matches(person, firstNameIsBill, lastNameIsOddie)).isTrue();
}
@Test
public void should_not_match_against_non_matching_single_bean() {
Map<String, String> person = mappedPerson("Bill", "Kidd");
BeanMatcher firstNameIsBill = BeanMatchers.the("firstName", is("Bill"));
BeanMatcher lastNameIsOddie = BeanMatchers.the("lastName", is("Oddie"));
assertThat(BeanMatcherAsserts.matches(person, firstNameIsBill, lastNameIsOddie)).isFalse();
}
@Test
public void should_display_detailed_diagnostics_when_a_single_bean_fails_to_match() {
Map<String, String> person = mappedPerson("Bill", "Kidd");
boolean assertionThrown = false;
String exceptionMessage = null;
try {
BeanMatcher firstNameIsBill = BeanMatchers.the("firstName", is("Bill"));
BeanMatcher lastNameIsOddie = BeanMatchers.the("lastName", is("Oddie"));
BeanMatcherAsserts.shouldMatch(person, firstNameIsBill, lastNameIsOddie);
} catch(AssertionError e) {
assertionThrown = true;
exceptionMessage = e.getMessage();
}
MatcherAssert.assertThat(assertionThrown, is(true));
MatcherAssert.assertThat(exceptionMessage,
allOf(containsString("Expected [firstName is 'Bill', lastName is 'Oddie'] but was"),
containsString("firstName = 'Bill'"),
containsString("lastName = 'Kidd")));
}
@Test
public void should_check_the_size_of_a_collection_and_its_contents() {
List<Map<String,String>> persons = Arrays.asList(mappedPerson("Bill", "Oddie"),
mappedPerson("Bill", "Kidd"),
mappedPerson("Graeam", "Garden"),
mappedPerson("Tim", "Brooke-Taylor"));
BeanMatcher containsTwoEntries = BeanMatchers.the_count(is(2));
BeanMatcher firstNameIsBill = BeanMatchers.the("firstName", is("Bill"));
BeanMatcherAsserts.shouldMatch(persons, containsTwoEntries, firstNameIsBill);
}
@Test
public void should_check_field_uniqueness() {
List<Map<String,String>> persons = Arrays.asList(mappedPerson("Bill", "Oddie"),
mappedPerson("Bill", "Kidd"),
mappedPerson("Graeam", "Garden"),
mappedPerson("Tim", "Brooke-Taylor"));
BeanMatcher containsTwoEntries = BeanMatchers.the_count(is(2));
BeanMatcher lastNamesAreDifferent = BeanMatchers.each("lastName").isDifferent();
BeanMatcher firstNameIsBill = BeanMatchers.the("firstName", is("Bill"));
BeanMatcherAsserts.shouldMatch(persons, containsTwoEntries, firstNameIsBill, lastNamesAreDifferent);
}
}