import { IInsightFacade, InsightDatasetKind, InsightError, InsightResult, NotFoundError, ResultTooLargeError, } from "../../src/controller/IInsightFacade"; import InsightFacade from "../../src/controller/InsightFacade"; import { clearDisk, getContentFromArchives, loadTestQuery } from "../TestUtil"; import { expect, use } from "chai"; import chaiAsPromised from "chai-as-promised"; use(chaiAsPromised); describe("InsightFacadeNam", function () { let facade: IInsightFacade; let sectionsQuery: string; let campus: string; // let fiveK: string; // let fiveKminusOne: string; // let fiveKone: string; before(async function () { // This block runs once and loads the datasets. // Declare datasets used in tests. You should add more datasets like this! //const sections: string = await getContentFromArchives("validSmallData.zip"); sectionsQuery = await getContentFromArchives("pairCourses.zip"); campus = await getContentFromArchives("campus.zip"); //const noResKey: string = await getContentFromArchives("noResKey.zip"); await clearDisk(); }); describe("PerformQuery", function () { /** * Loads the TestQuery specified in the test name and asserts the behaviour of performQuery. * * Note: the 'this' parameter is automatically set by Mocha and contains information about the test. */ async function checkQuery(this: Mocha.Context): Promise { if (!this.test) { throw new Error( "Invalid call to checkQuery." + "Usage: 'checkQuery' must be passed as the second parameter of Mocha's it(..) function." + "Do not invoke the function directly." ); } // Destructuring assignment to reduce property accesses const { input, expected, errorExpected, orderExpected, orderBy } = await loadTestQuery(this.test.title); //console.log(typeof input); input is an Object let result: InsightResult[] = []; // dummy value before being reassigned try { result = await facade.performQuery(input); } catch (err) { if (!errorExpected) { expect.fail(`performQuery threw unexpected error: ${err}`); } const errorClassMap: Record = { InsightError, NotFoundError, ResultTooLargeError, }; const expectedError = errorClassMap[expected]; expect(err).to.be.instanceOf(expectedError); return; } if (errorExpected) { expect.fail(`performQuery resolved when it should have rejected with ${expected}`); } //expect(result).to.deep.equal(expected); expect(result).to.have.deep.members(expected); expect(result).to.have.length(expected.length); if (orderExpected) { const resultAvg = result.map((item) => orderBy.map((key: any) => item[key])); const expectedAvg = expected.map((item: InsightResult) => orderBy.map((key: any) => item[key])); expect(resultAvg).to.deep.equal(expectedAvg); } return; } before(async function () { facade = new InsightFacade(); // Add the datasets to InsightFacade once. // Will *fail* if there is a problem reading ANY dataset. const loadDatasetPromises: Promise[] = [ facade.addDataset("sections", sectionsQuery, InsightDatasetKind.Sections), facade.addDataset("rooms", campus, InsightDatasetKind.Rooms), ]; try { await Promise.all(loadDatasetPromises); } catch (err) { throw new Error(`In PerformQuery Before hook, dataset(s) failed to be added. \n${err}`); } }); after(async function () { await clearDisk(); }); it("[invalid/apllyIsNull.json]", checkQuery); it("[invalid/apllyIsObject.json]", checkQuery); it("[invalid/applykeyIs__.json]", checkQuery); it("[invalid/applyRuleInvalidAvgString.json]", checkQuery); it("[invalid/applyRuleInvalidField.json]", checkQuery); it("[invalid/applyRuleInvalidKeyKind.json]", checkQuery); it("[invalid/applyRuleInvalidMaxString.json]", checkQuery); it("[invalid/applyRuleInvalidMinString.json]", checkQuery); it("[invalid/applyRuleInvalidSumString.json]", checkQuery); it("[invalid/applyRuleInvalidToken.json]", checkQuery); it("[invalid/applyRuleIsArray.json]", checkQuery); it("[invalid/applyRuleIsNull.json]", checkQuery); it("[invalid/directionIsArray.json]", checkQuery); it("[invalid/directionIsNull.json]", checkQuery); it("[invalid/directionIsNumber.json]", checkQuery); it("[invalid/directionIsWrong.json]", checkQuery); it("[invalid/duplicateKeyInApply.json]", checkQuery); it("[invalid/groupsHasKeyNotInColumnsOrApply.json]", checkQuery); it("[invalid/groupsIsEmpty.json]", checkQuery); it("[invalid/groupsIsNull.json]", checkQuery); it("[invalid/groupsIsObject.json]", checkQuery); it("[invalid/invalidKeyInApply.json]", checkQuery); it("[invalid/keyInColsNotInApplyOrGroup.json]", checkQuery); it("[invalid/keysIsNull.json]", checkQuery); it("[invalid/orderHasThreeKeys.json]", checkQuery); it("[invalid/orderHasZeroKeys.json]", checkQuery); it("[invalid/orderIsArray.json]", checkQuery); it("[invalid/orderMissingDirection.json]", checkQuery); it("[invalid/orderMissingKeys.json]", checkQuery); it("[invalid/transformationsHasThreeKeys.json]", checkQuery); it("[invalid/transformationsHasZeroKeys.json]", checkQuery); it("[invalid/transformationsIsNull.json]", checkQuery); it("[invalid/wrongFieldColumns.json]", checkQuery); it("[invalid/wrongFieldColumnsKind.json]", checkQuery); it("[invalid/wrongKeyWhere.json]", checkQuery); it("[invalid/groupedOver5000.json]", checkQuery); it("[valid/allRoomsFields.json]", checkQuery); it("[valid/applyIsEmpty.json]", checkQuery); it("[valid/applyKeyNotInCols.json]", checkQuery); it("[valid/countOnMkey.json]", checkQuery); it("[valid/groupBy1MaxMinAvgCount.json]", checkQuery); it("[valid/groupBy2MaxMinAvgCount.json]", checkQuery); it("[valid/groupBy3MaxMinAvgCount.json]", checkQuery); it("[valid/groupBy3SumMinAvgCount.json]", checkQuery); it("[valid/sortDown.json]", checkQuery); it("[valid/sortUp.json]", checkQuery); it("[valid/groupedNowUnder5000.json]", checkQuery); it("[valid/orderBy2.json]", checkQuery); it("[valid/orderBy3.json]", checkQuery); it("[valid/orderBy4.json]", checkQuery); it("[valid/orderBy2Sections.json]", checkQuery); it("[valid/orderBy3Sections.json]", checkQuery); it("[valid/orderBy2SectionsReverse.json]", checkQuery); it("[valid/orderBy3SectionsReverse.json]", checkQuery); it("[valid/orderBy2T.json]", checkQuery); it("[valid/orderBy3T.json]", checkQuery); it("[valid/orderBy2TR.json]", checkQuery); it("[valid/orderBy3TR.json]", checkQuery); it("[valid/allMaxcool.json]", checkQuery); it("[valid/emptyWhereButTransformationsGroup.json]", checkQuery); }); });