/** @see DATAMONGO-1552 */
  @Test
  public void shouldExposeDefaultCountField() {

    BucketOperation operation = bucket("field");

    assertThat(operation.getFields().exposesSingleFieldOnly(), is(true));
    assertThat(operation.getFields().getField("count"), is(notNullValue()));
  }
  /** @see DATAMONGO-1552 */
  @Test
  public void shouldRenderBucketOutputOperators() {

    BucketOperation operation =
        Aggregation.bucket("field") //
            .andOutputCount()
            .as("titles");

    DBObject dbObject = operation.toDBObject(Aggregation.DEFAULT_CONTEXT);
    assertThat(extractOutput(dbObject), is(JSON.parse("{ titles : { $sum: 1 } }")));
  }
  /** @see DATAMONGO-1552 */
  @Test
  public void shouldRenderAddToSetOperator() {

    BucketOperation operation =
        bucket("field") //
            .andOutput("title")
            .addToSet()
            .as("titles");

    DBObject dbObject = operation.toDBObject(Aggregation.DEFAULT_CONTEXT);
    assertThat(extractOutput(dbObject), is(JSON.parse("{ titles : { $addToSet: \"$title\" } }")));
  }
  /** @see DATAMONGO-1552 */
  @Test
  public void shouldRenderMinOperator() {

    BucketOperation operation =
        bucket("field") //
            .andOutput("score")
            .min()
            .as("min_score");

    DBObject dbObject = operation.toDBObject(Aggregation.DEFAULT_CONTEXT);
    assertThat(extractOutput(dbObject), is(JSON.parse("{ min_score : { $min: \"$score\" } }")));
  }
  /** @see DATAMONGO-1552 */
  @Test
  public void shouldRenderSumWithValueOperator() {

    BucketOperation operation =
        bucket("field") //
            .andOutput("score")
            .sum(4)
            .as("cummulated_score");

    DBObject dbObject = operation.toDBObject(Aggregation.DEFAULT_CONTEXT);
    assertThat(extractOutput(dbObject), is(JSON.parse("{ cummulated_score : { $sum: 4 } }")));
  }
  /** @see DATAMONGO-1552 */
  @Test
  public void shouldRenderSumWithOwnOutputExpression() {

    BucketOperation operation =
        bucket("field") //
            .andOutputExpression("netPrice + tax")
            .apply("$multiply", 5)
            .as("total");

    DBObject dbObject = operation.toDBObject(Aggregation.DEFAULT_CONTEXT);
    assertThat(
        extractOutput(dbObject),
        is(JSON.parse("{ total : { $multiply: [ {$add : [\"$netPrice\", \"$tax\"]}, 5] } }")));
  }
  /** @see DATAMONGO-1552 */
  @Test
  public void shouldRenderBucketOutputExpressions() {

    BucketOperation operation =
        Aggregation.bucket("field") //
            .andOutputExpression("(netPrice + surCharge) * taxrate * [0]", 2)
            .as("grossSalesPrice") //
            .andOutput("title")
            .push()
            .as("titles");

    DBObject dbObject = operation.toDBObject(Aggregation.DEFAULT_CONTEXT);
    assertThat(
        extractOutput(dbObject),
        is(
            JSON.parse(
                "{ \"grossSalesPrice\" : { \"$multiply\" : [ { \"$add\" : [ \"$netPrice\" , \"$surCharge\"]} , \"$taxrate\" , 2]} , \"titles\" : { $push: \"$title\" } }}")));
  }