text: /**
   * Test how $densify desugars.
   *
   * @tags: [
   *   # $mergeCursors was added to explain output in 5.3.
   *   requires_fcv_53,
   *   # We're testing the explain plan, not the query results, so the facet passthrough would fail.
   *   do_not_wrap_aggregations_in_facets,
   * ]
   */
  (function() {
  "use strict";
  
  load("jstests/libs/fixture_helpers.js");
  load("jstests/aggregation/extras/utils.js");  // For anyEq and
                                                // desugarSingleStageAggregation.
  
  const coll = db[jsTestName()];
  coll.insert({});
  
  // Implicit partition fields and sort are generated.
  assert.eq(desugarSingleStageAggregation(
                db, coll, {$densify: {field: "a", range: {step: 1.0, bounds: "full"}}}),
            [
                {$sort: {sortKey: {a: 1}}},
                {
                    $_internalDensify:
                        {field: "a", partitionByFields: [], range: {step: 1.0, bounds: "full"}}
                },
            ]);
  
  // PartitionByFields are prepended to the sortKey if "partition" is specified.
  assert.eq(
      desugarSingleStageAggregation(db, coll, {
          $densify:
              {field: "a", partitionByFields: ["b", "c"], range: {step: 1.0, bounds: "partition"}}
      }),
      [
          {$sort: {sortKey: {b: 1, c: 1, a: 1}}},
          {
              $_internalDensify:
                  {field: "a", partitionByFields: ["b", "c"], range: {step: 1.0, bounds: "partition"}}
          },
      ]);
  
  // PartitionByFields are not prepended to the sortKey if "full" is specified.
  assert.eq(
      desugarSingleStageAggregation(db, coll, {
          $densify: {field: "a", partitionByFields: ["b", "c"], range: {step: 1.0, bounds: "full"}}
      }),
      [
          {$sort: {sortKey: {a: 1}}},
          {
              $_internalDensify:
                  {field: "a", partitionByFields: ["b", "c"], range: {step: 1.0, bounds: "full"}}
          },
      ]);
  
  // PartitionByFields are prepended to the sortKey if numeric bounds are specified.
  assert.eq(
      desugarSingleStageAggregation(db, coll, {
          $densify: {field: "a", partitionByFields: ["b", "c"], range: {step: 1.0, bounds: [-10, 0]}}
      }),
      [
          {$sort: {sortKey: {b: 1, c: 1, a: 1}}},
          {
              $_internalDensify:
                  {field: "a", partitionByFields: ["b", "c"], range: {step: 1.0, bounds: [-10, 0]}}
          },
      ]);
  
  // PartitionByFields are prepended to the sortKey if date bounds are specified.
  assert.eq(desugarSingleStageAggregation(db, coll, {
                $densify: {
                    field: "a",
                    partitionByFields: ["b", "c"],
                    range: {
                        step: 1.0,
                        bounds: [new ISODate("2020-01-03"), new ISODate("2020-01-04")],
                        unit: "day"
                    }
                }
            }),
            [
                {$sort: {sortKey: {b: 1, c: 1, a: 1}}},
                {
                    $_internalDensify: {
                        field: "a",
                        partitionByFields: ["b", "c"],
                        range: {
                            step: 1.0,
                            bounds: [new ISODate("2020-01-03"), new ISODate("2020-01-04")],
                            unit: "day"
                        }
                    }
                },
            ]);
  })();
  