public void xtestNullNaNHandling() throws Exception {
    // create a feature collection
    SimpleFeatureType ft =
        DataUtilities.createType("classification.nullnan", "id:0,foo:int,bar:double");
    Integer iVal[] =
        new Integer[] {
          new Integer(0),
          new Integer(0),
          new Integer(0),
          new Integer(13),
          new Integer(13),
          new Integer(13),
          null,
          null,
          null
        };
    Double dVal[] =
        new Double[] {
          new Double(0.0),
          new Double(50.01),
          null,
          new Double(0.0),
          new Double(50.01),
          null,
          new Double(0.0),
          new Double(50.01),
          null
        };

    SimpleFeature[] testFeatures = new SimpleFeature[iVal.length];

    for (int i = 0; i < iVal.length; i++) {
      testFeatures[i] =
          SimpleFeatureBuilder.build(
              ft,
              new Object[] {
                new Integer(i + 1), iVal[i], dVal[i],
              },
              "nantest.t" + (i + 1));
    }
    MemoryDataStore store = new MemoryDataStore();
    store.createSchema(ft);
    store.addFeatures(testFeatures);
    FeatureCollection<SimpleFeatureType, SimpleFeature> thisFC =
        store.getFeatureSource("nullnan").getFeatures();

    // create the expression
    Divide divide = ff.divide(ff.property("foo"), ff.property("bar"));
    QuantileFunction qf = (QuantileFunction) ff.function("Quantile", divide, ff.literal(3));

    RangedClassifier range = (RangedClassifier) qf.evaluate(thisFC);
    assertEquals(2, range.getSize()); // 2 or 3?
    assertEquals("0..0", range.getTitle(0));
    assertEquals("0..0.25995", range.getTitle(1));
  }
  public void testEvaluateWithExpressions() throws Exception {
    Literal classes = ff.literal(2);
    PropertyName exp = ff.property("foo");
    Function func = ff.function("Quantile", exp, classes);

    Object value = func.evaluate(featureCollection);
    assertTrue(value instanceof RangedClassifier);
    RangedClassifier ranged = (RangedClassifier) value;

    // the values being quantiled are
    // {4,90,20,43,29,61,8,12};
    // so there should be two groups:
    // {4, 8, 12, 20}       4 <= x < 29
    // {29, 43, 61, 90}     29 <= x <= 90
    assertEquals(2, ranged.getSize());
    assertEquals("4..29", ranged.getTitle(0));
    assertEquals("29..90", ranged.getTitle(1));
  }
  /**
   * Test a feature collection where each feature will be in it's own bin.
   *
   * <p>Creates a feature collection with five features 1-5. Then uses the quantile function to put
   * these features in 5 bins. Each bin should have a single feature.
   *
   * @throws Exception
   */
  public void testSingleBin() throws Exception {

    // create a feature collection with five features values 1-5
    SimpleFeatureType dataType = DataUtilities.createType("classification.test1", "id:0,value:int");
    int iVal[] = new int[] {1, 2, 3, 4, 5};
    SimpleFeature[] myfeatures = new SimpleFeature[iVal.length];
    for (int i = 0; i < iVal.length; i++) {
      myfeatures[i] =
          SimpleFeatureBuilder.build(
              dataType,
              new Object[] {new Integer(i + 1), new Integer(iVal[i])},
              "classification.test1" + (i + 1));
    }
    MemoryDataStore store = new MemoryDataStore();
    store.createSchema(dataType);
    store.addFeatures(myfeatures);
    FeatureCollection<SimpleFeatureType, SimpleFeature> myFeatureCollection =
        store.getFeatureSource("test1").getFeatures();

    // run the quantile function
    org.opengis.filter.expression.Expression function =
        ff.function("Quantile", ff.property("value"), ff.literal(5));
    Classifier classifier = (Classifier) function.evaluate(myFeatureCollection);

    // verify the results
    assertNotNull(classifier);
    assertEquals(classifier.getClass(), RangedClassifier.class);
    RangedClassifier range = (RangedClassifier) classifier;
    assertEquals(5, range.getSize());

    for (int i = 0; i < 5; i++) {
      assertTrue(i + 1 == ((Number) range.getMin(i)).doubleValue());
      if (i != 4) {
        assertTrue(i + 2 == ((Number) range.getMax(i)).doubleValue());
        assertEquals((i + 1) + ".." + (i + 2), range.getTitle(i));
      } else {
        assertTrue(i + 1 == ((Number) range.getMax(i)).doubleValue());
        assertEquals((i + 1) + ".." + (i + 1), range.getTitle(i));
      }
    }
  }