/** @odoo-module */
import { setCellContent } from "@spreadsheet/../tests/utils/commands";
import { getCellValue, getEvaluatedCell } from "@spreadsheet/../tests/utils/getters";
import { createSpreadsheetWithPivot } from "@spreadsheet/../tests/utils/pivot";
import {
createModelWithDataSource,
waitForDataSourcesLoaded,
} from "@spreadsheet/../tests/utils/model";
QUnit.module("spreadsheet > positional pivot formula", {}, () => {
QUnit.test("Can have positional args in pivot formula", async function (assert) {
const { model } = await createSpreadsheetWithPivot();
// Columns
setCellContent(model, "H1", `=ODOO.PIVOT(1,"probability","#foo", 1)`);
setCellContent(model, "H2", `=ODOO.PIVOT(1,"probability","#foo", 2)`);
setCellContent(model, "H3", `=ODOO.PIVOT(1,"probability","#foo", 3)`);
setCellContent(model, "H4", `=ODOO.PIVOT(1,"probability","#foo", 4)`);
setCellContent(model, "H5", `=ODOO.PIVOT(1,"probability","#foo", 5)`);
assert.strictEqual(getCellValue(model, "H1"), 11);
assert.strictEqual(getCellValue(model, "H2"), 15);
assert.strictEqual(getCellValue(model, "H3"), 10);
assert.strictEqual(getCellValue(model, "H4"), 95);
assert.strictEqual(getCellValue(model, "H5"), "");
// Rows
setCellContent(model, "I1", `=ODOO.PIVOT(1,"probability","#bar", 1)`);
setCellContent(model, "I2", `=ODOO.PIVOT(1,"probability","#bar", 2)`);
setCellContent(model, "I3", `=ODOO.PIVOT(1,"probability","#bar", 3)`);
assert.strictEqual(getCellValue(model, "I1"), 15);
assert.strictEqual(getCellValue(model, "I2"), 116);
assert.strictEqual(getCellValue(model, "I3"), "");
});
QUnit.test("Can have positional args in pivot headers formula", async function (assert) {
const { model } = await createSpreadsheetWithPivot();
// Columns
setCellContent(model, "H1", `=ODOO.PIVOT.HEADER(1,"#foo",1)`);
setCellContent(model, "H2", `=ODOO.PIVOT.HEADER(1,"#foo",2)`);
setCellContent(model, "H3", `=ODOO.PIVOT.HEADER(1,"#foo",3)`);
setCellContent(model, "H4", `=ODOO.PIVOT.HEADER(1,"#foo",4)`);
setCellContent(model, "H5", `=ODOO.PIVOT.HEADER(1,"#foo",5)`);
setCellContent(model, "H6", `=ODOO.PIVOT.HEADER(1,"#foo",5, "measure", "probability")`);
assert.strictEqual(getCellValue(model, "H1"), 1);
assert.strictEqual(getCellValue(model, "H2"), 2);
assert.strictEqual(getCellValue(model, "H3"), 12);
assert.strictEqual(getCellValue(model, "H4"), 17);
assert.strictEqual(getCellValue(model, "H5"), "");
assert.strictEqual(getCellValue(model, "H6"), "Probability");
// Rows
setCellContent(model, "I1", `=ODOO.PIVOT.HEADER(1,"#bar",1)`);
setCellContent(model, "I2", `=ODOO.PIVOT.HEADER(1,"#bar",2)`);
setCellContent(model, "I3", `=ODOO.PIVOT.HEADER(1,"#bar",3)`);
setCellContent(model, "I4", `=ODOO.PIVOT.HEADER(1,"#bar",3, "measure", "probability")`);
assert.strictEqual(getCellValue(model, "I1"), "No");
assert.strictEqual(getCellValue(model, "I2"), "Yes");
assert.strictEqual(getCellValue(model, "I3"), "");
assert.strictEqual(getCellValue(model, "I4"), "Probability");
});
QUnit.test("pivot positional with two levels of group bys in rows", async (assert) => {
const { model } = await createSpreadsheetWithPivot({
arch: /*xml*/ `
`,
});
// Rows Headers
setCellContent(model, "H1", `=ODOO.PIVOT.HEADER(1,"bar","false","#product_id",1)`);
setCellContent(model, "H2", `=ODOO.PIVOT.HEADER(1,"bar","true","#product_id",1)`);
setCellContent(model, "H3", `=ODOO.PIVOT.HEADER(1,"#bar",1,"#product_id",1)`);
setCellContent(model, "H4", `=ODOO.PIVOT.HEADER(1,"#bar",2,"#product_id",1)`);
setCellContent(model, "H5", `=ODOO.PIVOT.HEADER(1,"#bar",3,"#product_id",1)`);
assert.strictEqual(getCellValue(model, "H1"), "xpad");
assert.strictEqual(getCellValue(model, "H2"), "xphone");
assert.strictEqual(getCellValue(model, "H3"), "xpad");
assert.strictEqual(getCellValue(model, "H4"), "xphone");
assert.strictEqual(getCellValue(model, "H5"), "");
// Cells
setCellContent(
model,
"H1",
`=ODOO.PIVOT(1,"probability","#bar",1,"#product_id",1,"#foo",2)`
);
setCellContent(
model,
"H2",
`=ODOO.PIVOT(1,"probability","#bar",1,"#product_id",2,"#foo",2)`
);
assert.strictEqual(getCellValue(model, "H1"), 15);
assert.strictEqual(getCellValue(model, "H2"), "");
});
QUnit.test("Positional argument without a number should crash", async (assert) => {
const { model } = await createSpreadsheetWithPivot();
setCellContent(model, "A10", `=ODOO.PIVOT.HEADER(1,"#bar","this is not a number")`);
assert.strictEqual(getCellValue(model, "A10"), "#ERROR");
assert.strictEqual(
getEvaluatedCell(model, "A10").error.message,
"The function ODOO.PIVOT.HEADER expects a number value, but 'this is not a number' is a string, and cannot be coerced to a number."
);
});
QUnit.test("sort first pivot column (ascending)", async (assert) => {
const spreadsheetData = {
pivots: {
1: {
colGroupBys: ["foo"],
rowGroupBys: ["bar"],
domain: [],
id: "1",
measures: [{ field: "probability" }],
model: "partner",
sortedColumn: {
groupId: [[], [1]],
measure: "probability",
order: "asc",
},
},
},
};
const model = await createModelWithDataSource({ spreadsheetData });
setCellContent(model, "A1", `=ODOO.PIVOT.HEADER(1,"#bar",1)`);
setCellContent(model, "A2", `=ODOO.PIVOT.HEADER(1,"#bar",2)`);
setCellContent(model, "B1", `=ODOO.PIVOT(1,"probability","#bar",1,"#foo",1)`);
setCellContent(model, "B2", `=ODOO.PIVOT(1,"probability","#bar",2,"#foo",1)`);
setCellContent(model, "C1", `=ODOO.PIVOT(1,"probability","#bar",1,"#foo",2)`);
setCellContent(model, "C2", `=ODOO.PIVOT(1,"probability","#bar",2,"#foo",2)`);
setCellContent(model, "D1", `=ODOO.PIVOT(1,"probability","#bar",1)`);
setCellContent(model, "D2", `=ODOO.PIVOT(1,"probability","#bar",2)`);
await waitForDataSourcesLoaded(model);
assert.strictEqual(getCellValue(model, "A1"), "No");
assert.strictEqual(getCellValue(model, "A2"), "Yes");
assert.strictEqual(getCellValue(model, "B1"), "");
assert.strictEqual(getCellValue(model, "B2"), 11);
assert.strictEqual(getCellValue(model, "C1"), 15);
assert.strictEqual(getCellValue(model, "C2"), "");
assert.strictEqual(getCellValue(model, "D1"), 15);
assert.strictEqual(getCellValue(model, "D2"), 116);
});
QUnit.test("sort first pivot column (descending)", async (assert) => {
const spreadsheetData = {
pivots: {
1: {
colGroupBys: ["foo"],
rowGroupBys: ["bar"],
domain: [],
id: "1",
measures: [{ field: "probability" }],
model: "partner",
sortedColumn: {
groupId: [[], [1]],
measure: "probability",
order: "desc",
},
},
},
};
const model = await createModelWithDataSource({ spreadsheetData });
setCellContent(model, "A1", `=ODOO.PIVOT.HEADER(1,"#bar",1)`);
setCellContent(model, "A2", `=ODOO.PIVOT.HEADER(1,"#bar",2)`);
setCellContent(model, "B1", `=ODOO.PIVOT(1,"probability","#bar",1,"#foo",1)`);
setCellContent(model, "B2", `=ODOO.PIVOT(1,"probability","#bar",2,"#foo",1)`);
setCellContent(model, "C1", `=ODOO.PIVOT(1,"probability","#bar",1,"#foo",2)`);
setCellContent(model, "C2", `=ODOO.PIVOT(1,"probability","#bar",2,"#foo",2)`);
setCellContent(model, "D1", `=ODOO.PIVOT(1,"probability","#bar",1)`);
setCellContent(model, "D2", `=ODOO.PIVOT(1,"probability","#bar",2)`);
await waitForDataSourcesLoaded(model);
assert.strictEqual(getCellValue(model, "A1"), "Yes");
assert.strictEqual(getCellValue(model, "A2"), "No");
assert.strictEqual(getCellValue(model, "B1"), 11);
assert.strictEqual(getCellValue(model, "B2"), "");
assert.strictEqual(getCellValue(model, "C1"), "");
assert.strictEqual(getCellValue(model, "C2"), 15);
assert.strictEqual(getCellValue(model, "D1"), 116);
assert.strictEqual(getCellValue(model, "D2"), 15);
});
QUnit.test("sort second pivot column (ascending)", async (assert) => {
const spreadsheetData = {
pivots: {
1: {
colGroupBys: ["foo"],
domain: [],
id: "1",
measures: [{ field: "probability" }],
model: "partner",
rowGroupBys: ["bar"],
name: "Partners by Foo",
sortedColumn: {
groupId: [[], [2]],
measure: "probability",
order: "asc",
},
},
},
};
const model = await createModelWithDataSource({ spreadsheetData });
setCellContent(model, "A1", `=ODOO.PIVOT.HEADER(1,"#bar",1)`);
setCellContent(model, "A2", `=ODOO.PIVOT.HEADER(1,"#bar",2)`);
setCellContent(model, "B1", `=ODOO.PIVOT(1,"probability","#bar",1,"#foo",1)`);
setCellContent(model, "B2", `=ODOO.PIVOT(1,"probability","#bar",2,"#foo",1)`);
setCellContent(model, "C1", `=ODOO.PIVOT(1,"probability","#bar",1,"#foo",2)`);
setCellContent(model, "C2", `=ODOO.PIVOT(1,"probability","#bar",2,"#foo",2)`);
setCellContent(model, "D1", `=ODOO.PIVOT(1,"probability","#bar",1)`);
setCellContent(model, "D2", `=ODOO.PIVOT(1,"probability","#bar",2)`);
await waitForDataSourcesLoaded(model);
assert.strictEqual(getCellValue(model, "A1"), "Yes");
assert.strictEqual(getCellValue(model, "A2"), "No");
assert.strictEqual(getCellValue(model, "B1"), 11);
assert.strictEqual(getCellValue(model, "B2"), "");
assert.strictEqual(getCellValue(model, "C1"), "");
assert.strictEqual(getCellValue(model, "C2"), 15);
assert.strictEqual(getCellValue(model, "D1"), 116);
assert.strictEqual(getCellValue(model, "D2"), 15);
});
QUnit.test("sort second pivot column (descending)", async (assert) => {
const spreadsheetData = {
pivots: {
1: {
colGroupBys: ["foo"],
domain: [],
id: "1",
measures: [{ field: "probability" }],
model: "partner",
rowGroupBys: ["bar"],
name: "Partners by Foo",
sortedColumn: {
groupId: [[], [2]],
measure: "probability",
order: "desc",
},
},
},
};
const model = await createModelWithDataSource({ spreadsheetData });
setCellContent(model, "A1", `=ODOO.PIVOT.HEADER(1,"#bar",1)`);
setCellContent(model, "A2", `=ODOO.PIVOT.HEADER(1,"#bar",2)`);
setCellContent(model, "B1", `=ODOO.PIVOT(1,"probability","#bar",1,"#foo",1)`);
setCellContent(model, "B2", `=ODOO.PIVOT(1,"probability","#bar",2,"#foo",1)`);
setCellContent(model, "C1", `=ODOO.PIVOT(1,"probability","#bar",1,"#foo",2)`);
setCellContent(model, "C2", `=ODOO.PIVOT(1,"probability","#bar",2,"#foo",2)`);
setCellContent(model, "D1", `=ODOO.PIVOT(1,"probability","#bar",1)`);
setCellContent(model, "D2", `=ODOO.PIVOT(1,"probability","#bar",2)`);
await waitForDataSourcesLoaded(model);
assert.strictEqual(getCellValue(model, "A1"), "No");
assert.strictEqual(getCellValue(model, "A2"), "Yes");
assert.strictEqual(getCellValue(model, "B1"), "");
assert.strictEqual(getCellValue(model, "B2"), 11);
assert.strictEqual(getCellValue(model, "C1"), 15);
assert.strictEqual(getCellValue(model, "C2"), "");
assert.strictEqual(getCellValue(model, "D1"), 15);
assert.strictEqual(getCellValue(model, "D2"), 116);
});
QUnit.test("sort second pivot measure (ascending)", async (assert) => {
const spreadsheetData = {
pivots: {
1: {
rowGroupBys: ["product_id"],
colGroupBys: [],
domain: [],
id: "1",
measures: [{ field: "probability" }, { field: "foo" }],
model: "partner",
sortedColumn: {
groupId: [[], []],
measure: "foo",
order: "asc",
},
},
},
};
const model = await createModelWithDataSource({ spreadsheetData });
setCellContent(model, "A10", `=ODOO.PIVOT.HEADER(1,"#product_id",1)`);
setCellContent(model, "A11", `=ODOO.PIVOT.HEADER(1,"#product_id",2)`);
setCellContent(model, "B10", `=ODOO.PIVOT(1,"probability","#product_id",1)`);
setCellContent(model, "B11", `=ODOO.PIVOT(1,"probability","#product_id",2)`);
setCellContent(model, "C10", `=ODOO.PIVOT(1,"foo","#product_id",1)`);
setCellContent(model, "C11", `=ODOO.PIVOT(1,"foo","#product_id",2)`);
await waitForDataSourcesLoaded(model);
assert.strictEqual(getCellValue(model, "A10"), "xphone");
assert.strictEqual(getCellValue(model, "A11"), "xpad");
assert.strictEqual(getCellValue(model, "B10"), 10);
assert.strictEqual(getCellValue(model, "B11"), 121);
assert.strictEqual(getCellValue(model, "C10"), 12);
assert.strictEqual(getCellValue(model, "C11"), 20);
});
QUnit.test("sort second pivot measure (descending)", async (assert) => {
const spreadsheetData = {
pivots: {
1: {
colGroupBys: [],
domain: [],
id: "1",
measures: [{ field: "probability" }, { field: "foo" }],
model: "partner",
rowGroupBys: ["product_id"],
sortedColumn: {
groupId: [[], []],
measure: "foo",
order: "desc",
},
},
},
};
const model = await createModelWithDataSource({ spreadsheetData });
setCellContent(model, "A10", `=ODOO.PIVOT.HEADER(1,"#product_id",1)`);
setCellContent(model, "A11", `=ODOO.PIVOT.HEADER(1,"#product_id",2)`);
setCellContent(model, "B10", `=ODOO.PIVOT(1,"probability","#product_id",1)`);
setCellContent(model, "B11", `=ODOO.PIVOT(1,"probability","#product_id",2)`);
setCellContent(model, "C10", `=ODOO.PIVOT(1,"foo","#product_id",1)`);
setCellContent(model, "C11", `=ODOO.PIVOT(1,"foo","#product_id",2)`);
await waitForDataSourcesLoaded(model);
assert.strictEqual(getCellValue(model, "A10"), "xpad");
assert.strictEqual(getCellValue(model, "A11"), "xphone");
assert.strictEqual(getCellValue(model, "B10"), 121);
assert.strictEqual(getCellValue(model, "B11"), 10);
assert.strictEqual(getCellValue(model, "C10"), 20);
assert.strictEqual(getCellValue(model, "C11"), 12);
});
QUnit.test("Formatting a pivot positional preserves the interval", async (assert) => {
const { model } = await createSpreadsheetWithPivot({
arch: /*xml*/ `
`,
});
setCellContent(model, "A1", `=ODOO.PIVOT.HEADER(1,"#date:day",1)`);
assert.strictEqual(getEvaluatedCell(model, "A1").formattedValue, "4/14/2016");
});
});