1f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot/*  Copyright (c) 2000-2006 hamcrest.org
2f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot */
3f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabotpackage org.hamcrest.number;
4f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot
5f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabotimport org.hamcrest.Description;
6f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabotimport org.hamcrest.Matcher;
7f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabotimport org.hamcrest.Factory;
8f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabotimport org.hamcrest.TypeSafeMatcher;
9f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot
10f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot
11f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot/**
12f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot * Is the value a number equal to a value within some range of
13f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot * acceptable error?
14f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot */
15f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabotpublic class IsCloseTo extends TypeSafeMatcher<Double> {
16f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot    private final double error;
17f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot    private final double value;
18f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot
19f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot    public IsCloseTo(double value, double error) {
20f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot        this.error = error;
21f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot        this.value = value;
22f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot    }
23f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot
24f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot    public boolean matchesSafely(Double item) {
25f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot        return Math.abs((item - value)) <= error;
26f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot    }
27f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot
28f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot    public void describeTo(Description description) {
29f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot        description.appendText("a numeric value within ")
30f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot                .appendValue(error)
31f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot                .appendText(" of ")
32f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot                .appendValue(value);
33f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot    }
34f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot
35f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot    @Factory
36f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot    public static Matcher<Double> closeTo(double operand, double error) {
37f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot        return new IsCloseTo(operand, error);
38f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot    }
39f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot
40f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot}
41