gristlabs_grist-core/sandbox/grist/testscript.json
Dmitry S e2226c3ab7 (core) Store formula values in DB, and include them into .stored/.undo fields of actions.
Summary:
- Introduce a new SQLiteDB migration, which adds DB columns for formula columns
- Newly added columns have the special ['P'] (pending) value in them
  (in order to show the usual "Loading..." on the first load that triggers the migration)
- Calculated values are added to .stored/.undo fields of user actions.
- Various changes made in the sandbox to include .stored/.undo in the right order.
- OnDemand tables ignore stored formula columns, replacing them with special SQL as before
- In particular, converting to OnDemand table leaves stale values in those
  columns, we should maybe clean those out.

Some tweaks on the side:
- Allow overriding chai assertion truncateThreshold with CHAI_TRUNCATE_THRESHOLD
- Rebuild python automatically in watch mode

Test Plan: Fixed various tests, updated some fixtures. Many python tests that check actions needed adjustments because actions moved from .stored to .undo. Some checks added to catch situations previously only caught in browser tests.

Reviewers: paulfitz

Reviewed By: paulfitz

Differential Revision: https://phab.getgrist.com/D2645
2020-11-04 16:45:47 -05:00

2928 lines
129 KiB
JSON

[{
//----------------------------------------------------------------------
"SAMPLE_NAME": "basic",
//----------------------------------------------------------------------
"SCHEMA": [
[1, "Students", [
[1, "firstName", "Text", false, "", "First Name", ""],
[2, "lastName", "Text", false, "", "Last Name", ""],
[3, "fullName", "Any", true, "rec.firstName + ' ' + rec.lastName", "Full Name", ""],
[4, "fullNameLen", "Any", true, "len(rec.fullName)", "Full Name Length", ""],
[5, "school", "Ref:Schools", false, "", "school", ""],
[6, "schoolShort", "Any", true, "rec.school.name.split(' ')[0]", "School Short", ""],
[9, "schoolRegion", "Any", true,
"addr = $school.address\naddr.state if addr.country == 'US' else addr.region", "School Region", ""]
]],
[2, "Schools", [
[10, "name", "Text", false, "", "Name", ""],
[12, "address", "Ref:Address",false, "", "Address", ""]
]],
[3, "Address", [
[21, "city", "Text", false, "", "City", ""],
[27, "state", "Text", false, "", "State", ""],
[28, "country", "Text", false, "'US'", "Country", ""],
[29, "region", "Any", true,
"{'US': 'North America', 'UK': 'Europe'}.get(rec.country, 'N/A')", "region", ""]
]]
],
"DATA": {
"Students": [
["id","firstName","lastName","school","@fullName","@fullNameLen","@schoolShort","@schoolRegion"],
[1, "Barack", "Obama", 2, "Barack Obama", 12, "Columbia", "NY"],
[2, "George W", "Bush", 8, "George W Bush", 13, "Yale", "CT"],
[3, "Bill", "Clinton", 6, "Bill Clinton", 12, "Oxford", "Europe"],
[4, "George H", "Bush", 8, "George H Bush", 13, "Yale", "CT"],
[5, "Ronald", "Reagan", 1, "Ronald Reagan", 13, "Eureka", "IL"],
[6, "Jimmy", "Carter", 5, "Jimmy Carter", 12, "U.S.", "MD"],
[8, "Gerald", "Ford", 7, "Gerald Ford", 11, "Yale", "CT"]],
"Schools": [
["id", "name", "address"],
[1, "Eureka College", 2],
[2, "Columbia University", 7],
[5, "U.S. Naval Academy", 3],
[6, "Oxford University", 10],
[7, "Yale Law School", 4],
[8, "Yale University", 4]],
"Address": [
["id", "city", "state", "country", "@region"],
[2, "Eureka", "IL", "US", "North America"],
[3, "Annapolis", "MD", "US", "North America"],
[4, "New Haven", "CT", "US", "North America"],
[7, "New York", "NY", "US", "North America"],
[10, "Oxford", "England", "UK", "Europe"]]
}
}, {
//----------------------------------------------------------------------
"SAMPLE_NAME": "simplest",
//----------------------------------------------------------------------
"SCHEMA": [
[1, "foo", [
[1, "bar", "Text", false, "", "bar", ""]
]]
],
"DATA": {
"foo": [
["id", "bar"],
[1, "apple"]
]
}
}, {
//----------------------------------------------------------------------
"TEST_CASE": "basic_load",
//----------------------------------------------------------------------
"BODY": [
["LOAD_SAMPLE", "basic"],
["CHECK_OUTPUT", {"USE_SAMPLE": "basic"}]
]
}, {
//----------------------------------------------------------------------
"TEST_CASE": "add_record",
//----------------------------------------------------------------------
"BODY": [
["LOAD_SAMPLE", "basic"],
["APPLY", {
// Ensure basic AddRecord works, generates undo, and triggers a formula calculation.
"USER_ACTION": ["AddRecord", "Address", 11, {
"city": "Washington",
"state": "DC",
"country": "US"
}],
"ACTIONS": {
// Essentially a duplicate of the UserAction, but as a DocAction.
"stored": [["AddRecord", "Address", 11, {
"city": "Washington",
"state": "DC",
"country": "US"
}],
["UpdateRecord", "Address", 11, {"region": "North America"}]
],
"undo": [["RemoveRecord", "Address", 11]],
"retValue": [ 11 ]
},
"CHECK_CALL_COUNTS": {
"Address" : {"region" : 1}
}
}],
["APPLY", {
// Add a Schools record which refers to the just-added Address.
"USER_ACTION": ["AddRecord", "Schools", 9, {
"name": "Georgetown University",
"address": 11
}],
"ACTIONS": {
"stored": [["AddRecord", "Schools", 9, {
"name": "Georgetown University",
"address": 11
}]],
"undo": [["RemoveRecord", "Schools", 9]],
"retValue": [9]
}
}],
["APPLY", {
// Set a student to the new school, and ensure formulas see the correct school and address.
"USER_ACTION": ["UpdateRecord", "Students", 3, {"school": 9}],
"ACTIONS": {
"stored": [
["UpdateRecord", "Students", 3, {"school": 9}],
["UpdateRecord", "Students", 3, {"schoolRegion": "DC"}],
["UpdateRecord", "Students", 3, {"schoolShort": "Georgetown"}]
],
"undo": [
["UpdateRecord", "Students", 3, {"school": 6}],
["UpdateRecord", "Students", 3, {"schoolRegion": "Europe"}],
["UpdateRecord", "Students", 3, {"schoolShort": "Oxford"}]
]
},
"CHECK_CALL_COUNTS": {
"Students" : { "schoolShort" : 1, "schoolRegion" : 1 }
}
}],
["CHECK_OUTPUT", {
"Students": [
["id", "firstName", "lastName", "school", "@fullName", "@fullNameLen", "@schoolShort",
"@schoolRegion"],
[1, "Barack", "Obama", 2, "Barack Obama", 12, "Columbia", "NY"],
[2, "George W", "Bush", 8, "George W Bush", 13, "Yale", "CT"],
[3, "Bill", "Clinton", 9, "Bill Clinton", 12, "Georgetown", "DC"],
[4, "George H", "Bush", 8, "George H Bush", 13, "Yale", "CT"],
[5, "Ronald", "Reagan", 1, "Ronald Reagan", 13, "Eureka", "IL"],
[6, "Jimmy", "Carter", 5, "Jimmy Carter", 12, "U.S.", "MD"],
[8, "Gerald", "Ford", 7, "Gerald Ford", 11, "Yale", "CT"]],
"Schools": [
["id", "name", "address"],
[1, "Eureka College", 2],
[2, "Columbia University", 7],
[5, "U.S. Naval Academy", 3],
[6, "Oxford University", 10],
[7, "Yale Law School", 4],
[8, "Yale University", 4],
[9, "Georgetown University", 11]],
"Address": [
["id", "city", "state", "country", "@region"],
[2, "Eureka", "IL", "US", "North America"],
[3, "Annapolis", "MD", "US", "North America"],
[4, "New Haven", "CT", "US", "North America"],
[7, "New York", "NY", "US", "North America"],
[10, "Oxford", "England", "UK", "Europe"],
[11, "Washington", "DC", "US", "North America"]]
}],
// Check that AddRecord applies default formulas values correctly
["APPLY", {
"USER_ACTIONS": [
["ModifyColumn", "Schools", "name", { "formula" : "'Williams College, ' + $address.city" }],
["AddRecord" , "Schools", 10, { "address": 2}],
["AddRecord" , "Schools", 11, { "name" : "Amherst College"}]
],
"ACTIONS": {
"stored": [
["ModifyColumn", "Schools", "name", {"formula": "'Williams College, ' + $address.city"}],
["UpdateRecord", "_grist_Tables_column", 10, {"formula": "'Williams College, ' + $address.city"}],
["AddRecord", "Schools", 10, { "address" : 2}],
["AddRecord", "Schools", 11, {"name": "Amherst College"}],
["UpdateRecord", "Schools", 10, {"name": "Williams College, Eureka"}]
],
"undo": [
["ModifyColumn", "Schools", "name", {"formula": ""}],
["UpdateRecord", "_grist_Tables_column", 10, {"formula": ""}],
["RemoveRecord", "Schools", 10],
["RemoveRecord", "Schools", 11]
]
},
"CHECK_CALL_COUNTS": {
"Schools": { "name": 1 },
"Students" : { "schoolShort" : 7 }
}
}],
["APPLY", {
"USER_ACTION": [
"UpdateRecord", "Schools", 10, { "address": 3}
],
"ACTIONS": {
// This tests that the formula for 'name' does NOT get recomputed
// As it would, if default formulas created dependencies
"stored" : [["UpdateRecord", "Schools", 10, { "address": 3}]],
"undo" : [["UpdateRecord", "Schools", 10, { "address": 2}]]
}
}],
["APPLY", {
"USER_ACTIONS": [
["ModifyColumn", "Schools", "name", { "formula" : "str($id) + '$' + '\\$' + \"$'\\\\'\"" }],
["AddRecord" , "Schools", 12, { "address" : 70 }]
],
"ACTIONS": {
"stored": [
["ModifyColumn", "Schools", "name", {"formula": "str($id) + '$' + '\\$' + \"$'\\\\'\""}],
["UpdateRecord", "_grist_Tables_column", 10, {"formula": "str($id) + '$' + '\\$' + \"$'\\\\'\""}],
["AddRecord", "Schools", 12, {"address": 70}],
["UpdateRecord", "Schools", 12, {"name": "12$\\$$'\\'"}]
],
"undo": [
["ModifyColumn", "Schools", "name", {"formula": "'Williams College, ' + $address.city"}],
["UpdateRecord", "_grist_Tables_column", 10, {"formula": "'Williams College, ' + $address.city"}],
["RemoveRecord", "Schools", 12]
]
},
"CHECK_CALL_COUNTS" : {
"Schools": { "name": 1 },
"Students" : { "schoolShort" : 7 }
}
}],
["APPLY", {
"USER_ACTIONS": [
// Does Adding Records properly set properties?
["AddColumn", "Schools", "numStudents", { "type" : "Int", "isFormula" : false }],
["AddRecord", "Schools", 13, {"name" : "NYU", "numStudents": "One-thousand"}],
["AddRecord", "Schools", null, {"numStudents": "1000000000000000000000000000"}],
["AddRecord", "Schools", null, {"numStudents": "1000000"}],
["ModifyColumn", "Schools", "numStudents", { "type" : "Numeric" }],
["AddRecord", "Schools", null, { "numStudents" : "Infinity" }]
],
"ACTIONS" : {
"stored": [
["AddColumn", "Schools", "numStudents",
{"formula": "", "isFormula": false, "type": "Int" }],
["AddRecord", "_grist_Tables_column", 30,
{"colId": "numStudents", "widgetOptions": "", "formula": "", "isFormula": false,
"label": "numStudents", "parentId": 2, "parentPos": 8.0, "type": "Int"}],
["AddRecord", "Schools", 13, {"name": "NYU", "numStudents": "One-thousand"}],
["AddRecord", "Schools", 14, {"numStudents": "1000000000000000000000000000"}],
["AddRecord", "Schools", 15, {"numStudents": 1000000}],
["ModifyColumn", "Schools", "numStudents", {"type": "Numeric"}],
// Record 13 is not updated since it can't be properly converted.
["BulkUpdateRecord", "Schools", [1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15],
{"numStudents": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1e+27, 1000000.0]}],
["UpdateRecord", "_grist_Tables_column", 30, {"type": "Numeric"}],
["AddRecord", "Schools", 16, {"numStudents": "@+Infinity"}],
["BulkUpdateRecord", "Schools", [14, 15, 16], {"name": ["14$\\$$'\\'", "15$\\$$'\\'", "16$\\$$'\\'"]}]
],
"undo" : [
["RemoveColumn", "Schools", "numStudents"],
["RemoveRecord", "_grist_Tables_column", 30],
["RemoveRecord", "Schools", 13],
["RemoveRecord", "Schools", 14],
["RemoveRecord", "Schools", 15],
// No updates in undo for Schools.numStudents column, because the undo removes this column.
["ModifyColumn", "Schools", "numStudents", {"type": "Int"}],
["UpdateRecord", "_grist_Tables_column", 30, {"type": "Int"}],
["RemoveRecord", "Schools", 16]
]
}
}],
["CHECK_OUTPUT", {
"Students": [
["id", "firstName", "lastName", "school", "@fullName", "@fullNameLen", "@schoolShort",
"@schoolRegion"],
[1, "Barack", "Obama", 2, "Barack Obama", 12, "Columbia", "NY"],
[2, "George W", "Bush", 8, "George W Bush", 13, "Yale", "CT"],
[3, "Bill", "Clinton", 9, "Bill Clinton", 12, "Georgetown", "DC"],
[4, "George H", "Bush", 8, "George H Bush", 13, "Yale", "CT"],
[5, "Ronald", "Reagan", 1, "Ronald Reagan", 13, "Eureka", "IL"],
[6, "Jimmy", "Carter", 5, "Jimmy Carter", 12, "U.S.", "MD"],
[8, "Gerald", "Ford", 7, "Gerald Ford", 11, "Yale", "CT"]],
"Schools": [
["id", "name", "address", "numStudents"],
[1, "Eureka College", 2, 0.0],
[2, "Columbia University", 7, 0.0],
[5, "U.S. Naval Academy", 3, 0.0],
[6, "Oxford University", 10, 0.0],
[7, "Yale Law School", 4, 0.0],
[8, "Yale University", 4, 0.0],
[9, "Georgetown University", 11, 0.0],
[10, "Williams College, Eureka",3, 0.0],
[11, "Amherst College" , 0, 0.0],
[12, "12$\\$$'\\'" , 70, 0.0],
[13, "NYU" , 0, "One-thousand"],
[14, "14$\\$$'\\'" , 0, 1e27],
[15, "15$\\$$'\\'" , 0, 1000000.0],
[16, "16$\\$$'\\'" , 0, "@+Infinity"]],
"Address": [
["id", "city", "state", "country", "@region"],
[2, "Eureka", "IL", "US", "North America"],
[3, "Annapolis", "MD", "US", "North America"],
[4, "New Haven", "CT", "US", "North America"],
[7, "New York", "NY", "US", "North America"],
[10, "Oxford", "England", "UK", "Europe"],
[11, "Washington", "DC", "US", "North America"]]
}]
]
}, {
//----------------------------------------------------------------------
"TEST_CASE": "bulk_add_record",
//----------------------------------------------------------------------
"BODY": [
["LOAD_SAMPLE", "basic"],
["APPLY", {
// Ensure basic BulkAddRecord works, generates undo, and triggers a formula calculation.
"USER_ACTION": ["BulkAddRecord", "Address", [11, null], {
"city": ["Washington", "Portland"],
"state": ["DC", "OR"]
}],
"ACTIONS": {
"stored": [
["BulkAddRecord", "Address", [11, 12], {
"city": ["Washington", "Portland"],
"state": ["DC", "OR"]
}],
["BulkUpdateRecord", "Address", [11, 12], {"country": ["US", "US"]}],
["BulkUpdateRecord", "Address", [11, 12], {
"region": ["North America", "North America"]
}]
],
"undo": [["BulkRemoveRecord", "Address", [11, 12]]],
"retValue": [ [11, 12] ]
},
"CHECK_CALL_COUNTS" : {
"Address" : { "country": 2, "region" : 2 }
}
}],
["CHECK_OUTPUT", {
"USE_SAMPLE": "basic",
"Address": [
["id", "city", "state", "country", "@region"],
[2, "Eureka", "IL", "US", "North America"],
[3, "Annapolis", "MD", "US", "North America"],
[4, "New Haven", "CT", "US", "North America"],
[7, "New York", "NY", "US", "North America"],
[10, "Oxford", "England", "UK", "Europe"],
[11, "Washington", "DC", "US", "North America"],
[12, "Portland", "OR", "US", "North America"]]
}]
]
}, {
//----------------------------------------------------------------------
"TEST_CASE": "update_record",
//----------------------------------------------------------------------
"BODY": [
["LOAD_SAMPLE", "basic"],
["APPLY", {
"USER_ACTION": ["UpdateRecord", "Address", 10, {"country": "GB"}],
"ACTIONS": {
"stored": [
["UpdateRecord", "Address", 10, {"country": "GB"}],
["UpdateRecord", "Address", 10, {"region": "N/A"}],
["UpdateRecord", "Students", 3, {"schoolRegion": "N/A"}]
],
"undo": [
["UpdateRecord", "Address", 10, {"country": "UK"}],
["UpdateRecord", "Address", 10, {"region": "Europe"}],
["UpdateRecord", "Students", 3, {"schoolRegion": "Europe"}]
]
},
"CHECK_CALL_COUNTS" : {
"Address" : { "region" : 1 },
"Students" : { "schoolRegion" : 1 }
}
}],
["APPLY", {
"USER_ACTION": ["BulkUpdateRecord", "Schools", [1, 2, 8],
{"name": ["eureka", "columbia", "yale"]}],
"ACTIONS": {
"stored": [["BulkUpdateRecord", "Schools", [1, 2, 8],
{"name": ["eureka", "columbia", "yale"]}],
["BulkUpdateRecord", "Students", [1, 2, 4, 5],
{"schoolShort": ["columbia", "yale", "yale", "eureka"]}]
],
"undo": [["BulkUpdateRecord", "Schools", [1, 2, 8],
{"name": ["Eureka College", "Columbia University", "Yale University"]}],
["BulkUpdateRecord", "Students", [1, 2, 4, 5],
{"schoolShort": ["Columbia", "Yale", "Yale", "Eureka"]}]
]
},
"CHECK_CALL_COUNTS" : {
"Students" : { "schoolShort" : 4 }
}
}],
["CHECK_OUTPUT", {
"Students": [
["id", "firstName", "lastName", "school", "@fullName", "@fullNameLen", "@schoolShort",
"@schoolRegion"],
[1, "Barack", "Obama", 2, "Barack Obama", 12, "columbia", "NY"],
[2, "George W", "Bush", 8, "George W Bush", 13, "yale", "CT"],
[3, "Bill", "Clinton", 6, "Bill Clinton", 12, "Oxford", "N/A"],
[4, "George H", "Bush", 8, "George H Bush", 13, "yale", "CT"],
[5, "Ronald", "Reagan", 1, "Ronald Reagan", 13, "eureka", "IL"],
[6, "Jimmy", "Carter", 5, "Jimmy Carter", 12, "U.S.", "MD"],
[8, "Gerald", "Ford", 7, "Gerald Ford", 11, "Yale", "CT"]],
"Schools": [
["id", "name", "address"],
[1, "eureka", 2],
[2, "columbia", 7],
[5, "U.S. Naval Academy", 3],
[6, "Oxford University", 10],
[7, "Yale Law School", 4],
[8, "yale", 4]],
"Address": [
["id", "city", "state", "country", "@region"],
[2, "Eureka", "IL", "US", "North America"],
[3, "Annapolis", "MD", "US", "North America"],
[4, "New Haven", "CT", "US", "North America"],
[7, "New York", "NY", "US", "North America"],
[10, "Oxford", "England", "GB", "N/A"]]
}],
["APPLY", {
// Check that Update Record on _grist_Tables_column properly triggers schema-change actions
"USER_ACTIONS": [
["UpdateRecord", "_grist_Tables_column", 3,
{"formula": "str.upper(rec.firstName) + ' ' + rec.lastName"}],
["UpdateRecord", "_grist_Tables_column", 6,
{"colId" : "shortSchool"}]
],
"ACTIONS": {
"stored": [
["ModifyColumn", "Students", "fullName",
{"formula": "str.upper(rec.firstName) + ' ' + rec.lastName"}],
["UpdateRecord", "_grist_Tables_column", 3,
{"formula": "str.upper(rec.firstName) + ' ' + rec.lastName"}],
["RenameColumn", "Students", "schoolShort", "shortSchool"],
["UpdateRecord", "_grist_Tables_column", 6, {"colId": "shortSchool"}],
["BulkUpdateRecord", "Students", [1, 2, 3, 4, 5, 6, 8],
{"fullName": ["BARACK Obama", "GEORGE W Bush", "BILL Clinton", "GEORGE H Bush", "RONALD Reagan", "JIMMY Carter", "GERALD Ford"]}]
],
"undo": [
["ModifyColumn", "Students", "fullName",
{"formula": "rec.firstName + ' ' + rec.lastName"}],
["UpdateRecord", "_grist_Tables_column", 3,
{"formula": "rec.firstName + ' ' + rec.lastName"}],
["RenameColumn", "Students", "shortSchool", "schoolShort"],
["UpdateRecord", "_grist_Tables_column", 6, {"colId": "schoolShort"}],
["BulkUpdateRecord", "Students", [1, 2, 3, 4, 5, 6, 8],
{"fullName": ["Barack Obama", "George W Bush", "Bill Clinton", "George H Bush", "Ronald Reagan", "Jimmy Carter", "Gerald Ford"]}]
]
},
"CHECK_CALL_COUNTS" : {
"Students" : { "fullName" : 7, "fullNameLen" : 7 , "shortSchool" : 7}
}
}],
["APPLY", {
"USER_ACTIONS" : [
// Check that noop Update Records do not generate docactions
["UpdateRecord", "Students", 1, { "firstName" : "Barack", "lastName" : "Obama", "school": 2}],
["UpdateRecord", "Students", 2, { "firstName" : "Richard", "lastName" : "Nixon", "school": 8}]
],
"ACTIONS" : {
"stored" : [
["UpdateRecord", "Students", 2, {"firstName" : "Richard", "lastName" : "Nixon"}],
["UpdateRecord", "Students", 2, {"fullName" : "RICHARD Nixon"}]
],
"undo" : [
["UpdateRecord", "Students", 2, {"firstName" : "George W", "lastName" : "Bush"}],
["UpdateRecord", "Students", 2, {"fullName": "GEORGE W Bush"}]
]
},
"CHECK_CALL_COUNTS" : {
"Students" : { "fullName" : 1, "fullNameLen" : 1 }
}
}],
["CHECK_OUTPUT", {
"Students": [
["id", "firstName", "lastName", "school", "@fullName", "@fullNameLen", "@shortSchool",
"@schoolRegion"],
[1, "Barack", "Obama", 2, "BARACK Obama", 12, "columbia", "NY"],
[2, "Richard", "Nixon", 8, "RICHARD Nixon", 13, "yale", "CT"],
[3, "Bill", "Clinton", 6, "BILL Clinton", 12, "Oxford", "N/A"],
[4, "George H", "Bush", 8, "GEORGE H Bush", 13, "yale", "CT"],
[5, "Ronald", "Reagan", 1, "RONALD Reagan", 13, "eureka", "IL"],
[6, "Jimmy", "Carter", 5, "JIMMY Carter", 12, "U.S.", "MD"],
[8, "Gerald", "Ford", 7, "GERALD Ford", 11, "Yale", "CT"]],
"Schools": [
["id", "name", "address"],
[1, "eureka", 2],
[2, "columbia", 7],
[5, "U.S. Naval Academy", 3],
[6, "Oxford University", 10],
[7, "Yale Law School", 4],
[8, "yale", 4]],
"Address": [
["id", "city", "state", "country", "@region"],
[2, "Eureka", "IL", "US", "North America"],
[3, "Annapolis", "MD", "US", "North America"],
[4, "New Haven", "CT", "US", "North America"],
[7, "New York", "NY", "US", "North America"],
[10, "Oxford", "England", "GB", "N/A"]]
}]
]
}, {
//----------------------------------------------------------------------
"TEST_CASE": "remove_record",
//----------------------------------------------------------------------
"BODY": [
["LOAD_SAMPLE", "basic"],
// Apply some 'remove' actions. Besides removing the records themselves, they should also
// unset references that point to them.
["APPLY", {
"USER_ACTION": ["RemoveRecord", "Address", 4],
"ACTIONS": {
"stored": [
["RemoveRecord", "Address", 4],
["BulkUpdateRecord", "Schools", [7, 8], {"address": [0, 0]}],
["BulkUpdateRecord", "Students", [2, 4, 8], {"schoolRegion": [null, null, null]}]
],
"undo": [
["AddRecord", "Address", 4, {"city": "New Haven", "country": "US", "region": "North America", "state": "CT"}],
["BulkUpdateRecord", "Schools", [7, 8], {"address": [4, 4]}],
["BulkUpdateRecord", "Students", [2, 4, 8], {"schoolRegion": ["CT", "CT", "CT"]}]
]
},
"CHECK_CALL_COUNTS" : {
"Students" : { "schoolRegion" : 3 }
}
}],
["APPLY", {
"USER_ACTION": ["RemoveRecord", "Schools", 5],
"ACTIONS": {
"stored": [
["RemoveRecord", "Schools", 5],
["UpdateRecord", "Students", 6, {"school": 0}],
["UpdateRecord", "Students", 6, {"schoolRegion": null}],
["UpdateRecord", "Students", 6, {"schoolShort": ""}]
],
"undo": [
["AddRecord", "Schools", 5, {"name": "U.S. Naval Academy", "address": 3}],
["UpdateRecord", "Students", 6, {"school": 5}],
["UpdateRecord", "Students", 6, {"schoolRegion": "MD"}],
["UpdateRecord", "Students", 6, {"schoolShort": "U.S."}]
]
},
"CHECK_CALL_COUNTS" : {
"Students" : { "schoolShort" : 1, "schoolRegion" : 1 }
}
}],
["APPLY", {
"USER_ACTION": ["RemoveRecord", "Students", 1],
"ACTIONS": {
"stored": [["RemoveRecord", "Students", 1]],
"undo": [["AddRecord", "Students", 1,
{"firstName": "Barack", "fullName": "Barack Obama", "fullNameLen": 12, "lastName": "Obama", "school": 2, "schoolRegion": "NY", "schoolShort": "Columbia"}]
]
}
}],
["CHECK_OUTPUT", {
"Students": [
["id","firstName","lastName","school","@fullName","@fullNameLen","@schoolShort",
"@schoolRegion"],
[2, "George W", "Bush", 8, "George W Bush",13, "Yale", null],
[3, "Bill", "Clinton", 6, "Bill Clinton", 12, "Oxford", "Europe"],
[4, "George H", "Bush", 8, "George H Bush",13, "Yale", null],
[5, "Ronald", "Reagan", 1, "Ronald Reagan",13, "Eureka", "IL"],
[6, "Jimmy", "Carter", 0, "Jimmy Carter", 12, "", null],
[8, "Gerald", "Ford", 7, "Gerald Ford", 11, "Yale", null]],
"Schools": [
["id", "name", "address"],
[1, "Eureka College", 2],
[2, "Columbia University", 7],
[6, "Oxford University", 10],
[7, "Yale Law School", 0],
[8, "Yale University", 0]],
"Address": [
["id", "city", "state", "country", "@region"],
[2, "Eureka", "IL", "US", "North America"],
[3, "Annapolis", "MD", "US", "North America"],
[7, "New York", "NY", "US", "North America"],
[10, "Oxford", "England", "UK", "Europe"]]
}]
]
}, {
//----------------------------------------------------------------------
"TEST_CASE": "bulk_remove_record",
//----------------------------------------------------------------------
"BODY": [
["LOAD_SAMPLE", "basic"],
["APPLY", {
// Ensure basic BulkRemoveRecord works, generates undo, and triggers a formula calculation.
"USER_ACTION": ["BulkRemoveRecord", "Students", [2, 5, 6, 8]],
"ACTIONS": {
"stored": [["BulkRemoveRecord", "Students", [2, 5, 6, 8]]],
"undo": [["BulkAddRecord", "Students", [2, 5, 6, 8], {
"firstName": ["George W", "Ronald", "Jimmy", "Gerald"],
"lastName": ["Bush", "Reagan", "Carter", "Ford"],
"school": [8, 1, 5, 7],
"fullName": ["George W Bush", "Ronald Reagan", "Jimmy Carter", "Gerald Ford"],
"fullNameLen": [13, 13, 12, 11],
"schoolRegion": ["CT", "IL", "MD", "CT"],
"schoolShort": ["Yale", "Eureka", "U.S.", "Yale"]
}]]
}
}],
["APPLY", {
// Ensure that BulkRemoveRecord also unsets linked records.
"USER_ACTION": ["BulkRemoveRecord", "Schools", [6, 8]],
"ACTIONS": {
"stored": [
["BulkRemoveRecord", "Schools", [6, 8]],
["BulkUpdateRecord", "Students", [3, 4], {"school": [0, 0]}],
["BulkUpdateRecord", "Students", [3, 4], {"schoolRegion": [null, null]}],
["BulkUpdateRecord", "Students", [3, 4], {"schoolShort": ["", ""]}]
],
"undo": [
["BulkAddRecord", "Schools", [6, 8], {
"name": ["Oxford University", "Yale University"],
"address": [10, 4]
}],
["BulkUpdateRecord", "Students", [3, 4], {"school": [6, 8]}],
["BulkUpdateRecord", "Students", [3, 4], {"schoolRegion": ["Europe", "CT"]}],
["BulkUpdateRecord", "Students", [3, 4], {"schoolShort": ["Oxford", "Yale"]}]
]
},
"CHECK_CALL_COUNTS" : {
"Students" : { "schoolRegion" : 2, "schoolShort": 2 }
}
}],
["CHECK_OUTPUT", {
"USE_SAMPLE": "basic",
"Students": [
["id","firstName","lastName","school","@fullName","@fullNameLen","@schoolShort","@schoolRegion"],
[1, "Barack", "Obama", 2, "Barack Obama", 12, "Columbia", "NY"],
[3, "Bill", "Clinton", 0, "Bill Clinton", 12, "", null],
[4, "George H", "Bush", 0, "George H Bush", 13, "", null]],
"Schools": [
["id", "name", "address"],
[1, "Eureka College", 2],
[2, "Columbia University", 7],
[5, "U.S. Naval Academy", 3],
[7, "Yale Law School", 4]]
}]
]
}, {
//----------------------------------------------------------------------
"TEST_CASE": "add_column",
//----------------------------------------------------------------------
"BODY": [
["LOAD_SAMPLE", "basic"],
// Test basic addition of a non-formula column.
["APPLY", {
"USER_ACTION": ["AddColumn", "Address", "zip", {
"type": "Text",
"isFormula": false,
"formula": "",
"label": "something",
"widgetOptions": ""
}],
"ACTIONS": {
"stored": [
["AddColumn", "Address", "zip", {
"type": "Text",
"isFormula": false,
"formula": ""
}],
// Note that a metadata record outght to be added too.
["AddRecord", "_grist_Tables_column", 30, {
"parentId": 3,
"parentPos": 8.0,
"colId": "zip",
"type": "Text",
"isFormula": false,
"formula": "",
"label": "something",
"widgetOptions": ""
}]
],
"undo": [
["RemoveColumn", "Address", "zip"],
["RemoveRecord", "_grist_Tables_column", 30]
],
"retValue": [
{"colId": "zip", "colRef": 30}
]
}
}],
["CHECK_OUTPUT", {
"USE_SAMPLE": "basic",
"Address": [
["id", "city", "state", "country", "zip", "@region"],
[2, "Eureka", "IL", "US", "", "North America"],
[3, "Annapolis", "MD", "US", "", "North America"],
[4, "New Haven", "CT", "US", "", "North America"],
[7, "New York", "NY", "US", "", "North America"],
[10, "Oxford", "England", "UK", "", "Europe"]]
}],
// Make sure we can modify this new column for existing records.
["APPLY", {
"USER_ACTION": ["BulkUpdateRecord", "Address", [2, 4, 7],
{"zip": ["61530-0001", "06520-0002", "10027-0003"]}],
"ACTIONS": {
"stored": [["BulkUpdateRecord", "Address", [2, 4, 7],
{"zip": ["61530-0001", "06520-0002", "10027-0003"]}]],
"undo": [["BulkUpdateRecord", "Address", [2, 4, 7],
{"zip": ["", "", ""]}]]
}
}],
["CHECK_OUTPUT", {
"USE_SAMPLE": "basic",
"Address": [
["id", "city", "state", "country", "zip", "@region"],
[2, "Eureka", "IL", "US", "61530-0001", "North America"],
[3, "Annapolis", "MD", "US", "", "North America"],
[4, "New Haven", "CT", "US", "06520-0002", "North America"],
[7, "New York", "NY", "US", "10027-0003", "North America"],
[10, "Oxford", "England", "UK", "", "Europe"]]
}],
// Now try adding a formula column.
["APPLY", {
"USER_ACTION": [
"AddColumn", "Address", "zip5", {
"isFormula": true,
"formula": "rec.zip[:5]"
}],
"ACTIONS": {
"stored": [
["AddColumn", "Address", "zip5",
{ "formula": "rec.zip[:5]", "type": "Any", "isFormula": true}],
["AddRecord", "_grist_Tables_column", 31, {
"parentId": 3,
"parentPos": 9.0,
"colId": "zip5",
"type": "Any",
"isFormula": true,
"formula": "rec.zip[:5]",
"label": "zip5",
"widgetOptions": ""
}],
// Since it's a formula, it immediately gets evaluated, causing some calc actions.
["BulkUpdateRecord", "Address", [2, 3, 4, 7, 10],
{"zip5": ["61530", "", "06520", "10027", ""]}]
],
"undo": [
["RemoveColumn", "Address", "zip5"],
["RemoveRecord", "_grist_Tables_column", 31]
],
"retValue": [
{"colId": "zip5", "colRef": 31}
]
},
"CHECK_CALL_COUNTS": {
"Address" : { "zip5" : 5 }
}
}],
// And another formula column which refers to another table.
["APPLY", {
"USER_ACTION": [
"AddColumn", "Schools", "zip", {
"isFormula": true,
"formula": "rec.address.zip[:5]",
"label": "zippy",
"widgetOptions": ""
}
],
"ACTIONS": {
"stored": [
["AddColumn", "Schools", "zip", {
"type": "Any",
"isFormula": true,
"formula": "rec.address.zip[:5]"
}],
["AddRecord", "_grist_Tables_column", 32, {
"parentId": 2,
// There are only two other fields in Schools to start with.
"parentPos": 10.0,
"colId": "zip",
"type": "Any",
"isFormula": true,
"formula": "rec.address.zip[:5]",
"label": "zippy",
"widgetOptions": ""
}],
["BulkUpdateRecord", "Schools", [1,2,5,6,7,8],
{"zip": ["61530", "10027", "", "", "06520", "06520"]}]
],
"undo": [
["RemoveColumn", "Schools", "zip"],
["RemoveRecord", "_grist_Tables_column", 32]
],
"retValue": [
{"colId": "zip", "colRef": 32}
]
},
"CHECK_CALL_COUNTS" : {
"Schools" : { "zip" : 6 }
}
}],
["CHECK_OUTPUT", {
"USE_SAMPLE": "basic",
"Schools": [
["id", "name", "address", "@zip"],
[1, "Eureka College", 2, "61530"],
[2, "Columbia University", 7, "10027"],
[5, "U.S. Naval Academy", 3, ""],
[6, "Oxford University", 10, ""],
[7, "Yale Law School", 4, "06520"],
[8, "Yale University", 4, "06520"]],
"Address": [
["id", "city", "state", "country", "zip", "@zip5", "@region"],
[2, "Eureka", "IL", "US", "61530-0001", "61530", "North America"],
[3, "Annapolis", "MD", "US", "", "", "North America"],
[4, "New Haven", "CT", "US", "06520-0002", "06520", "North America"],
[7, "New York", "NY", "US", "10027-0003", "10027", "North America"],
[10, "Oxford", "England", "UK", "", "", "Europe"]]
}],
["APPLY", {
"USER_ACTIONS": [
// Our sample data doesn't include Views metadata, but we can have some generated via
// AddTable action. The initial and newly-added column are as in "add_table" test case.
["AddTable", "Bar", [
{ "id": "hello", "type": "Text", "isFormula": false }
]],
["AddColumn", "Bar", "world",
{ "type": "Text", "isFormula": true, "formula": "rec.hello.upper()"}
]
],
"ACTIONS": {
"stored": [
// Actions generated from AddTable.
["AddTable", "Bar", [
{"isFormula": false, "formula": "", "type": "ManualSortPos", "id": "manualSort"},
{"isFormula": false, "formula": "", "type": "Text", "id": "hello"}
]],
["AddRecord", "_grist_Tables", 4, {"primaryViewId": 0, "tableId": "Bar"}],
["BulkAddRecord", "_grist_Tables_column", [33, 34],
{ "colId": ["manualSort", "hello"],
"formula": ["", ""],
"isFormula": [false, false],
"label": ["manualSort", "hello"],
"parentId": [4, 4],
"parentPos": [11.0, 12.0],
"type": ["ManualSortPos", "Text"],
"widgetOptions": ["", ""]
}],
// Raw view
["AddRecord", "_grist_Views", 1,
{"type": "raw_data", "name": "Bar"}],
["AddRecord", "_grist_TabBar", 1, {"tabPos": 1.0, "viewRef": 1}],
["AddRecord", "_grist_Pages", 1, {"indentation": 0, "pagePos": 1.0, "viewRef": 1}],
["AddRecord", "_grist_Views_section", 1,
{"tableRef": 4, "defaultWidth": 100, "borderWidth": 1,
"parentId": 1, "parentKey": "record", "sortColRefs": "[]", "title": "" }],
["AddRecord", "_grist_Views_section_field", 1,
{"parentId": 1, "colRef": 34, "parentPos": 1.0}],
["UpdateRecord", "_grist_Tables", 4, {"primaryViewId": 1}],
// Actions generated from AddColumn.
["AddColumn", "Bar", "world",
{"isFormula": true, "formula": "rec.hello.upper()", "type": "Text"}],
["AddRecord", "_grist_Tables_column", 35,
{"colId": "world", "parentPos": 13.0,
"formula": "rec.hello.upper()", "parentId": 4, "type": "Text",
"isFormula": true, "label": "world", "widgetOptions": ""}],
["AddRecord", "_grist_Views_section_field", 2, {"colRef": 35, "parentId": 1, "parentPos": 2.0}]
],
"undo": [
["RemoveTable", "Bar"],
["RemoveRecord", "_grist_Tables", 4],
["BulkRemoveRecord", "_grist_Tables_column", [33, 34]],
["RemoveRecord", "_grist_Views", 1],
["RemoveRecord", "_grist_TabBar", 1],
["RemoveRecord", "_grist_Pages", 1],
["RemoveRecord", "_grist_Views_section", 1],
["RemoveRecord", "_grist_Views_section_field", 1],
["UpdateRecord", "_grist_Tables", 4, {"primaryViewId": 0}],
["RemoveColumn", "Bar", "world"],
["RemoveRecord", "_grist_Tables_column", 35],
["RemoveRecord", "_grist_Views_section_field", 2]
],
"retValue": [
{
"table_id": "Bar",
"id": 4,
"columns": ["hello"],
"views": [{"sections": [1], "id": 1}]
},
{"colId": "world", "colRef": 35}
]
}
}],
// Expect same output as before, with one extra table.
["CHECK_OUTPUT", {
"USE_SAMPLE": "basic",
"Bar": [
["id", "manualSort", "hello", "@world"]
],
"Schools": [
["id", "name", "address", "@zip"],
[1, "Eureka College", 2, "61530"],
[2, "Columbia University", 7, "10027"],
[5, "U.S. Naval Academy", 3, ""],
[6, "Oxford University", 10, ""],
[7, "Yale Law School", 4, "06520"],
[8, "Yale University", 4, "06520"]],
"Address": [
["id", "city", "state", "country", "zip", "@zip5", "@region"],
[2, "Eureka", "IL", "US", "61530-0001", "61530", "North America"],
[3, "Annapolis", "MD", "US", "", "", "North America"],
[4, "New Haven", "CT", "US", "06520-0002", "06520", "North America"],
[7, "New York", "NY", "US", "10027-0003", "10027", "North America"],
[10, "Oxford", "England", "UK", "", "", "Europe"]]
}]
]
}, {
//----------------------------------------------------------------------
"TEST_CASE": "remove_column",
//----------------------------------------------------------------------
"BODY": [
["LOAD_SAMPLE", "basic"],
// Set some values in column-to-be-removed to defaults, to check they get omitted from undo.
["APPLY", {
"USER_ACTION": ["UpdateRecord", "Address", 3, {"city": ""}],
"ACTIONS": {
"stored": [["UpdateRecord", "Address", 3, {"city": ""}]],
"undo": [["UpdateRecord", "Address", 3, {"city": "Annapolis"}]]
}
}],
// Test removing a regular data column.
["APPLY", {
"USER_ACTION": ["RemoveColumn", "Address", "city"],
"ACTIONS": {
"stored": [
["RemoveRecord", "_grist_Tables_column", 21],
["RemoveColumn", "Address", "city"]],
"undo": [
["AddRecord", "_grist_Tables_column", 21, {
"parentId": 3,
"parentPos": 1.0,
"colId": "city",
"type": "Text",
"label": "City"
}],
["BulkUpdateRecord", "Address", [2, 4, 7, 10],
{"city": ["Eureka", "New Haven", "New York", "Oxford"]}],
["AddColumn", "Address", "city", {
"type": "Text",
"isFormula": false,
"formula": ""
}]
]
}
}],
["CHECK_OUTPUT", {
"USE_SAMPLE": "basic",
"Address": [
["id", "state", "country", "@region"],
[2, "IL", "US", "North America"],
[3, "MD", "US", "North America"],
[4, "CT", "US", "North America"],
[7, "NY", "US", "North America"],
[10, "England", "UK", "Europe"]]
}],
// Test removing a formula column.
["APPLY", {
"USER_ACTION": ["RemoveColumn", "Students", "fullNameLen"],
"ACTIONS": {
"stored": [
["RemoveRecord", "_grist_Tables_column", 4],
["RemoveColumn", "Students", "fullNameLen"]
],
"undo": [
["BulkUpdateRecord", "Students", [1, 2, 3, 4, 5, 6, 8], {"fullNameLen": [12, 13, 12, 13, 13, 12, 11]}],
["AddRecord", "_grist_Tables_column", 4, {
"parentId": 1,
"parentPos": 4.0,
"colId": "fullNameLen",
"type": "Any",
"isFormula": true,
"formula": "len(rec.fullName)",
"label" : "Full Name Length"
}],
["AddColumn", "Students", "fullNameLen", {
"type": "Any",
"isFormula": true,
"formula": "len(rec.fullName)"
}]
]
}
}],
["CHECK_OUTPUT", {
"USE_SAMPLE": "basic",
"Students": [
["id","firstName","lastName","school","@fullName", "@schoolShort","@schoolRegion"],
[1, "Barack", "Obama", 2, "Barack Obama", "Columbia", "NY"],
[2, "George W", "Bush", 8, "George W Bush", "Yale", "CT"],
[3, "Bill", "Clinton", 6, "Bill Clinton", "Oxford", "Europe"],
[4, "George H", "Bush", 8, "George H Bush", "Yale", "CT"],
[5, "Ronald", "Reagan", 1, "Ronald Reagan", "Eureka", "IL"],
[6, "Jimmy", "Carter", 5, "Jimmy Carter", "U.S.", "MD"],
[8, "Gerald", "Ford", 7, "Gerald Ford", "Yale", "CT"]],
"Address": [
["id", "state", "country", "@region"],
[2, "IL", "US", "North America"],
[3, "MD", "US", "North America"],
[4, "CT", "US", "North America"],
[7, "NY", "US", "North America"],
[10, "England", "UK", "Europe"]]
}],
// If we end up with an invalid reference, we should get reference errors in the data, but not die.
["APPLY", {
"USER_ACTION": ["RemoveColumn", "Address", "state"],
"ACTIONS": {
"stored": [
["RemoveRecord", "_grist_Tables_column", 27],
["RemoveColumn", "Address", "state"],
["BulkUpdateRecord", "Students", [1, 2, 4, 5, 6, 8],
{"schoolRegion": [["E","AttributeError"], ["E","AttributeError"],
["E","AttributeError"], ["E","AttributeError"], ["E","AttributeError"],
["E","AttributeError"]]
}]
],
"undo": [
["AddRecord", "_grist_Tables_column", 27, {
"parentId": 3,
"parentPos": 2.0,
"colId": "state",
"type": "Text",
"label": "State"
}],
["BulkUpdateRecord", "Address", [2, 3, 4, 7, 10],
{"state": ["IL", "MD", "CT", "NY", "England"]}],
["AddColumn", "Address", "state", {
"type": "Text",
"isFormula": false,
"formula": ""
}],
["BulkUpdateRecord", "Students", [1, 2, 4, 5, 6, 8], {"schoolRegion": ["NY", "CT", "CT", "IL", "MD", "CT"]}]
]
},
"CHECK_CALL_COUNTS": {
"Students" : { "schoolRegion" : 7 }
}
}],
["CHECK_OUTPUT", {
"USE_SAMPLE": "basic",
"Students": [
["id","firstName","lastName","school","@fullName", "@schoolShort","@schoolRegion"],
[1, "Barack", "Obama", 2, "Barack Obama", "Columbia", ["E","AttributeError"]],
[2, "George W", "Bush", 8, "George W Bush", "Yale", ["E","AttributeError"]],
[3, "Bill", "Clinton", 6, "Bill Clinton", "Oxford", "Europe"],
[4, "George H", "Bush", 8, "George H Bush", "Yale", ["E","AttributeError"]],
[5, "Ronald", "Reagan", 1, "Ronald Reagan", "Eureka", ["E","AttributeError"]],
[6, "Jimmy", "Carter", 5, "Jimmy Carter", "U.S.", ["E","AttributeError"]],
[8, "Gerald", "Ford", 7, "Gerald Ford", "Yale", ["E","AttributeError"]]],
"Address": [
["id", "country", "@region"],
[2, "US", "North America"],
[3, "US", "North America"],
[4, "US", "North America"],
[7, "US", "North America"],
[10, "UK", "Europe"]]
}],
// Test that when we remove a Reference column, we don't get errors modifying its target
// table.
["APPLY", {
"USER_ACTIONS": [
["RemoveColumn", "Students", "school"],
["RemoveColumn", "Students", "schoolShort"],
["RemoveRecord", "Schools", 1],
["RemoveRecord", "Schools", 8]
],
"ACTIONS": {
"stored": [
["RemoveRecord", "_grist_Tables_column", 5],
["RemoveColumn", "Students", "school"],
["RemoveRecord", "_grist_Tables_column", 6],
["RemoveColumn", "Students", "schoolShort"],
["RemoveRecord", "Schools", 1],
["RemoveRecord", "Schools", 8],
["UpdateRecord", "Students", 3,
{"schoolRegion": ["E","AttributeError"]}]
],
"undo": [
["BulkUpdateRecord", "Students", [1, 2, 3, 4, 5, 6, 8], {"schoolShort": ["Columbia", "Yale", "Oxford", "Yale", "Eureka", "U.S.", "Yale"]}],
["AddRecord", "_grist_Tables_column", 5, {"parentPos": 5.0, "parentId": 1,
"colId": "school", "type": "Ref:Schools", "label": "school"
}],
["BulkUpdateRecord", "Students", [1,2,3,4,5,6,8], {"school": [2,8,6,8,1,5,7]}],
["AddColumn", "Students", "school", {"isFormula": false,
"formula": "", "type": "Ref:Schools"}],
["AddRecord", "_grist_Tables_column", 6, {
"parentPos": 6.0, "isFormula": 1, "parentId": 1,
"colId": "schoolShort", "formula": "rec.school.name.split(' ')[0]",
"type": "Any", "label": "School Short"
}],
["AddColumn", "Students", "schoolShort", {"isFormula": true,
"formula": "rec.school.name.split(' ')[0]", "type": "Any"}],
["AddRecord", "Schools", 1, {"name": "Eureka College", "address": 2}],
["AddRecord", "Schools", 8, {"name": "Yale University", "address": 4}],
["UpdateRecord", "Students", 3, {"schoolRegion": "Europe"}]
]
},
"CHECK_CALL_COUNTS": {
"Students" : { "schoolRegion" : 7 }
}
}],
["CHECK_OUTPUT", {
"Students": [
["id","firstName","lastName","@fullName", "@schoolRegion"],
[1, "Barack", "Obama", "Barack Obama", ["E","AttributeError"]],
[2, "George W", "Bush", "George W Bush", ["E","AttributeError"]],
[3, "Bill", "Clinton", "Bill Clinton", ["E","AttributeError"]],
[4, "George H", "Bush", "George H Bush", ["E","AttributeError"]],
[5, "Ronald", "Reagan", "Ronald Reagan", ["E","AttributeError"]],
[6, "Jimmy", "Carter", "Jimmy Carter", ["E","AttributeError"]],
[8, "Gerald", "Ford", "Gerald Ford", ["E","AttributeError"]]],
"Schools": [
["id", "name", "address"],
[2, "Columbia University", 7],
[5, "U.S. Naval Academy", 3],
[6, "Oxford University", 10],
[7, "Yale Law School", 4]],
"Address": [
["id", "country", "@region"],
[2, "US", "North America"],
[3, "US", "North America"],
[4, "US", "North America"],
[7, "US", "North America"],
[10, "UK", "Europe"]]
}],
// To test that columns get removed from the views, use AddTable (which causes a View to be
// created) and then RemoveColumn from that.
["APPLY", {
"USER_ACTIONS": [
["AddTable", "ViewTest", [
{ "id": "hello", "type": "Text", "isFormula": false, "label": "", "widgetOptions": ""},
{ "id": "world", "type": "Text", "isFormula": true, "formula": "rec.hello.upper()", "label": "", "widgetOptions": ""}
]],
["RemoveColumn", "ViewTest", "hello"]
],
"ACTIONS": {
"stored": [
["AddTable", "ViewTest", [
{"isFormula": false, "formula": "", "type": "ManualSortPos", "id": "manualSort"},
{"isFormula": false, "formula": "", "type": "Text", "id": "hello"},
{"isFormula": true, "formula": "rec.hello.upper()", "type": "Text", "id": "world"}
]],
["AddRecord", "_grist_Tables", 4, {"primaryViewId": 0, "tableId": "ViewTest"}],
["BulkAddRecord", "_grist_Tables_column", [30,31,32], {
"colId": ["manualSort","hello","world"],
"formula": ["","","rec.hello.upper()"],
"parentPos": [8.0,9.0,10.0],
"isFormula": [false,false,true],
"label": ["manualSort","",""],
"parentId": [4,4,4],
"type": ["ManualSortPos","Text","Text"],
"widgetOptions": ["","",""]
}],
// Raw view
["AddRecord", "_grist_Views", 1,
{"type": "raw_data", "name": "ViewTest"}],
["AddRecord", "_grist_TabBar", 1, {"tabPos": 1.0, "viewRef": 1}],
["AddRecord", "_grist_Pages", 1, {"indentation": 0, "pagePos": 1.0, "viewRef": 1}],
["AddRecord", "_grist_Views_section", 1,
{"tableRef": 4, "defaultWidth": 100, "borderWidth": 1,
"parentId": 1, "parentKey": "record", "sortColRefs": "[]", "title": ""}],
["BulkAddRecord", "_grist_Views_section_field", [1,2],
{"parentId": [1,1], "colRef": [31,32], "parentPos": [1.0,2.0]}],
["UpdateRecord", "_grist_Tables", 4, {"primaryViewId": 1}],
["RemoveRecord", "_grist_Views_section_field", 1],
["RemoveRecord", "_grist_Tables_column", 31],
["RemoveColumn", "ViewTest", "hello"]
],
"undo": [
["RemoveTable", "ViewTest"],
["RemoveRecord", "_grist_Tables", 4],
["BulkRemoveRecord", "_grist_Tables_column", [30,31,32]],
["RemoveRecord", "_grist_Views", 1],
["RemoveRecord", "_grist_TabBar", 1],
["RemoveRecord", "_grist_Pages", 1],
["RemoveRecord", "_grist_Views_section", 1],
["BulkRemoveRecord", "_grist_Views_section_field", [1,2]],
["UpdateRecord", "_grist_Tables", 4, {"primaryViewId": 0}],
["AddRecord", "_grist_Views_section_field", 1,
{"parentId": 1, "colRef": 31, "parentPos": 1.0}],
["AddRecord", "_grist_Tables_column", 31,
{"colId": "hello", "parentPos": 9.0,
"parentId": 4, "type": "Text"
}],
["AddColumn", "ViewTest", "hello",
{"isFormula": false, "formula": "", "type": "Text"}]
]
}
}]
]
}, {
//----------------------------------------------------------------------
"TEST_CASE": "rename_column",
//----------------------------------------------------------------------
"BODY": [
["LOAD_SAMPLE", "basic"],
["APPLY", {
"USER_ACTIONS": [
["RenameColumn", "Address", "city", "town"],
["RenameColumn", "Students", "fullNameLen", "nameLen"],
["UpdateRecord", "Address", 10, {"town": "Ox-ford"}]
],
"ACTIONS": {
"stored": [
["RenameColumn", "Address", "city", "town"],
["UpdateRecord", "_grist_Tables_column", 21, {"colId": "town"}],
["RenameColumn", "Students", "fullNameLen", "nameLen"],
["UpdateRecord", "_grist_Tables_column", 4, {"colId": "nameLen"}],
["UpdateRecord", "Address", 10, {"town": "Ox-ford"}]
],
"undo": [
["RenameColumn", "Address", "town", "city"],
["UpdateRecord", "_grist_Tables_column", 21, {"colId": "city"}],
["RenameColumn", "Students", "nameLen", "fullNameLen"],
["UpdateRecord", "_grist_Tables_column", 4, {"colId": "fullNameLen"}],
["UpdateRecord", "Address", 10, {"town": "Oxford"}]
]
},
"CHECK_CALL_COUNTS" : {
"Students" : {"nameLen" : 7}
}
}],
["CHECK_OUTPUT", {
"USE_SAMPLE": "basic",
"Students": [
["id","firstName","lastName","school","@fullName","@nameLen","@schoolShort",
"@schoolRegion"],
[1, "Barack", "Obama", 2, "Barack Obama", 12, "Columbia", "NY"],
[2, "George W", "Bush", 8, "George W Bush",13, "Yale", "CT"],
[3, "Bill", "Clinton", 6, "Bill Clinton", 12, "Oxford", "Europe"],
[4, "George H", "Bush", 8, "George H Bush",13, "Yale", "CT"],
[5, "Ronald", "Reagan", 1, "Ronald Reagan",13, "Eureka", "IL"],
[6, "Jimmy", "Carter", 5, "Jimmy Carter", 12, "U.S.", "MD"],
[8, "Gerald", "Ford", 7, "Gerald Ford", 11, "Yale", "CT"]],
"Address": [
["id", "town", "state", "country", "@region"],
[2, "Eureka", "IL", "US", "North America"],
[3, "Annapolis", "MD", "US", "North America"],
[4, "New Haven", "CT", "US", "North America"],
[7, "New York", "NY", "US", "North America"],
[10, "Ox-ford", "England", "UK", "Europe"]]
}],
// Test that when we rename a Reference column, changes to the target table still work.
["APPLY", {
"USER_ACTIONS": [
["RenameColumn", "Students", "school", "university"],
["RemoveRecord", "Schools", 1],
["RemoveRecord", "Schools", 8]
],
"ACTIONS": {
"stored": [
["RenameColumn", "Students", "school", "university"],
["ModifyColumn", "Students", "schoolShort",
{"formula": "rec.university.name.split(' ')[0]"}],
["ModifyColumn", "Students", "schoolRegion", { "formula":
"addr = $university.address\naddr.state if addr.country == 'US' else addr.region"
}],
["BulkUpdateRecord", "_grist_Tables_column", [5,6,9], {
"colId": ["university", "schoolShort", "schoolRegion"],
"formula": [
"",
"rec.university.name.split(' ')[0]",
"addr = $university.address\naddr.state if addr.country == 'US' else addr.region"
]
}],
["RemoveRecord", "Schools", 1],
["UpdateRecord", "Students", 5, {"university": 0}],
["RemoveRecord", "Schools", 8],
["BulkUpdateRecord", "Students", [2, 4], {"university": [0, 0]}],
["BulkUpdateRecord", "Students", [2, 4, 5], {"schoolRegion": [null, null, null]}],
["BulkUpdateRecord", "Students", [2, 4, 5], {"schoolShort": ["", "", ""]}]
],
"undo": [
["RenameColumn", "Students", "university", "school"],
["ModifyColumn", "Students", "schoolShort",
{"formula": "rec.school.name.split(' ')[0]"}],
["ModifyColumn", "Students", "schoolRegion", { "formula":
"addr = $school.address\naddr.state if addr.country == 'US' else addr.region"
}],
["BulkUpdateRecord", "_grist_Tables_column", [5,6,9], {
"colId": ["school", "schoolShort", "schoolRegion"],
"formula": [
"",
"rec.school.name.split(' ')[0]",
"addr = $school.address\naddr.state if addr.country == 'US' else addr.region"
]
}],
["AddRecord", "Schools", 1, {"name": "Eureka College", "address": 2}],
["UpdateRecord", "Students", 5, {"university": 1}],
["AddRecord", "Schools", 8, {"name": "Yale University", "address": 4}],
["BulkUpdateRecord", "Students", [2, 4], {"university": [8, 8]}],
["BulkUpdateRecord", "Students", [2, 4, 5], {"schoolRegion": ["CT", "CT", "IL"]}],
["BulkUpdateRecord", "Students", [2, 4, 5], {"schoolShort": ["Yale", "Yale", "Eureka"]}]
]
},
"CHECK_CALL_COUNTS" : {
"Students" : { "schoolShort" : 7, "schoolRegion" : 7 }
}
}],
["CHECK_OUTPUT", {
"Students": [
["id","firstName","lastName","university","@fullName","@nameLen", "@schoolShort", "@schoolRegion"],
[1, "Barack", "Obama", 2, "Barack Obama", 12, "Columbia", "NY" ],
[2, "George W", "Bush", 0, "George W Bush",13, "", null ],
[3, "Bill", "Clinton", 6, "Bill Clinton", 12, "Oxford", "Europe"],
[4, "George H", "Bush", 0, "George H Bush",13, "", null ],
[5, "Ronald", "Reagan", 0, "Ronald Reagan",13, "", null ],
[6, "Jimmy", "Carter", 5, "Jimmy Carter", 12, "U.S.", "MD" ],
[8, "Gerald", "Ford", 7, "Gerald Ford", 11, "Yale", "CT" ]],
"Schools": [
["id", "name", "address"],
[2, "Columbia University", 7],
[5, "U.S. Naval Academy", 3],
[6, "Oxford University", 10],
[7, "Yale Law School", 4]],
"Address": [
["id", "town", "state", "country", "@region"],
[2, "Eureka", "IL", "US", "North America"],
[3, "Annapolis", "MD", "US", "North America"],
[4, "New Haven", "CT", "US", "North America"],
[7, "New York", "NY", "US", "North America"],
[10, "Ox-ford", "England", "UK", "Europe"]]
}],
["APPLY", {
"USER_ACTIONS": [
// Check that column renaming plays well with property columns
["ModifyColumn", "Address", "state", { "type" : "Int" }],
["UpdateRecord", "Address", 2, { "state" : 73 }]
],
"ACTIONS": {
"stored": [
["ModifyColumn", "Address", "state", {"type": "Int"}],
["UpdateRecord", "_grist_Tables_column", 27, {"type": "Int"}],
["UpdateRecord", "Address", 2, {"state": 73}]
],
"undo": [
["ModifyColumn", "Address", "state", {"type": "Text"}],
["UpdateRecord", "_grist_Tables_column", 27, {"type": "Text"}],
["UpdateRecord", "Address", 2, {"state": "IL"}]
]
}
}],
["CHECK_OUTPUT", {
"Students": [
["id","firstName","lastName","university","@fullName","@nameLen", "@schoolShort", "@schoolRegion"],
[1, "Barack", "Obama", 2, "Barack Obama", 12, "Columbia", "NY" ],
[2, "George W", "Bush", 0, "George W Bush",13, "", null ],
[3, "Bill", "Clinton", 6, "Bill Clinton", 12, "Oxford", "Europe"],
[4, "George H", "Bush", 0, "George H Bush",13, "", null ],
[5, "Ronald", "Reagan", 0, "Ronald Reagan",13, "", null ],
[6, "Jimmy", "Carter", 5, "Jimmy Carter", 12, "U.S.", "MD" ],
[8, "Gerald", "Ford", 7, "Gerald Ford", 11, "Yale", "CT" ]],
"Schools": [
["id", "name", "address"],
[2, "Columbia University", 7],
[5, "U.S. Naval Academy", 3],
[6, "Oxford University", 10],
[7, "Yale Law School", 4]],
"Address": [
["id", "town", "state", "country", "@region"],
[2, "Eureka", 73, "US", "North America"],
[3, "Annapolis", "MD", "US", "North America"],
[4, "New Haven", "CT", "US", "North America"],
[7, "New York", "NY", "US", "North America"],
[10, "Ox-ford", "England","UK", "Europe"]]
}],
["APPLY", {
"USER_ACTIONS": [
["RenameColumn", "Address", "state", "stateName"],
["ModifyColumn", "Address", "stateName", { "type" : "Numeric"}]
],
"ACTIONS": {
"stored": [
["RenameColumn", "Address", "state", "stateName"],
["ModifyColumn", "Students", "schoolRegion", { "formula":
"addr = $university.address\naddr.stateName if addr.country == 'US' else addr.region"
}],
["BulkUpdateRecord", "_grist_Tables_column", [27, 9], {
"colId": ["stateName", "schoolRegion"],
"formula": ["",
"addr = $university.address\naddr.stateName if addr.country == 'US' else addr.region"]
}],
["ModifyColumn", "Address", "stateName", {"type": "Numeric"}],
["UpdateRecord", "Address", 2, {"stateName": 73.0}],
["UpdateRecord", "_grist_Tables_column", 27, {"type": "Numeric"}]
],
"undo": [
["RenameColumn", "Address", "stateName", "state"],
["ModifyColumn", "Students", "schoolRegion", { "formula":
"addr = $university.address\naddr.state if addr.country == 'US' else addr.region"
}],
["BulkUpdateRecord", "_grist_Tables_column", [27, 9], {
"colId": ["state", "schoolRegion"],
"formula": ["",
"addr = $university.address\naddr.state if addr.country == 'US' else addr.region"]
}],
["UpdateRecord", "Address", 2, {"stateName": 73}],
["ModifyColumn", "Address", "stateName", {"type": "Int"}],
["UpdateRecord", "_grist_Tables_column", 27, {"type": "Int"}]
]
}
}],
["CHECK_OUTPUT", {
"Students": [
["id","firstName","lastName","university","@fullName","@nameLen", "@schoolShort", "@schoolRegion"],
[1, "Barack", "Obama", 2, "Barack Obama", 12, "Columbia", "NY" ],
[2, "George W", "Bush", 0, "George W Bush",13, "", null ],
[3, "Bill", "Clinton", 6, "Bill Clinton", 12, "Oxford", "Europe"],
[4, "George H", "Bush", 0, "George H Bush",13, "", null ],
[5, "Ronald", "Reagan", 0, "Ronald Reagan",13, "", null ],
[6, "Jimmy", "Carter", 5, "Jimmy Carter", 12, "U.S.", "MD" ],
[8, "Gerald", "Ford", 7, "Gerald Ford", 11, "Yale", "CT" ]],
"Schools": [
["id", "name", "address"],
[2, "Columbia University", 7],
[5, "U.S. Naval Academy", 3],
[6, "Oxford University", 10],
[7, "Yale Law School", 4]],
"Address": [
["id", "town", "stateName", "country", "@region"],
[2, "Eureka", 73, "US", "North America"],
[3, "Annapolis", "MD", "US", "North America"],
[4, "New Haven", "CT", "US", "North America"],
[7, "New York", "NY", "US", "North America"],
[10, "Ox-ford", "England","UK", "Europe"]]
}],
// Check that renaming a column to same name without changes is a no-op.
["APPLY", {
"USER_ACTION" : ["RenameColumn", "Students", "university", "university"],
"ACTIONS" : {
"stored" : [],
"undo" : []
}
}]
]
}, {
//----------------------------------------------------------------------
"TEST_CASE": "rename_column2",
//----------------------------------------------------------------------
"BODY": [
["LOAD_SAMPLE", "basic"],
// Check that we can rename a column via a metadata update.
["APPLY", {
"USER_ACTION": ["UpdateRecord", "_grist_Tables_column", 6, {"colId": "short"}],
"ACTIONS": {
"stored": [
["RenameColumn", "Students", "schoolShort", "short"],
["UpdateRecord", "_grist_Tables_column", 6, {"colId": "short"}]
],
"undo": [
["RenameColumn", "Students", "short", "schoolShort"],
["UpdateRecord", "_grist_Tables_column", 6, {"colId": "schoolShort"}]
]
}
}],
// Check that we can rename a column to a conflicting name, and a unique name will be chosen.
["APPLY", {
"USER_ACTION": ["UpdateRecord", "_grist_Tables_column", 6, {"colId": "school"}],
"ACTIONS": {
"stored": [
["RenameColumn", "Students", "short", "school2"],
["UpdateRecord", "_grist_Tables_column", 6, {"colId": "school2"}]
],
"undo": [
["RenameColumn", "Students", "school2", "short"],
["UpdateRecord", "_grist_Tables_column", 6, {"colId": "short"}]
]
}
}],
["CHECK_OUTPUT", {
"USE_SAMPLE": "basic",
"Students": [
["id","firstName","lastName","school","@fullName","@fullNameLen","@school2","@schoolRegion"],
[1, "Barack", "Obama", 2, "Barack Obama", 12, "Columbia", "NY"],
[2, "George W", "Bush", 8, "George W Bush", 13, "Yale", "CT"],
[3, "Bill", "Clinton", 6, "Bill Clinton", 12, "Oxford", "Europe"],
[4, "George H", "Bush", 8, "George H Bush", 13, "Yale", "CT"],
[5, "Ronald", "Reagan", 1, "Ronald Reagan", 13, "Eureka", "IL"],
[6, "Jimmy", "Carter", 5, "Jimmy Carter", 12, "U.S.", "MD"],
[8, "Gerald", "Ford", 7, "Gerald Ford", 11, "Yale", "CT"]]
}]
]
}, {
//----------------------------------------------------------------------
"TEST_CASE": "modify_column",
//----------------------------------------------------------------------
"BODY": [
["LOAD_SAMPLE", "basic"],
["APPLY", {
// Check that Modifying formulas works
"USER_ACTION": ["ModifyColumn", "Address", "city", {"formula": "'Anytown'"}],
"ACTIONS": {
"stored": [
["ModifyColumn", "Address", "city", {"formula": "'Anytown'"}],
["UpdateRecord", "_grist_Tables_column", 21, {"formula": "'Anytown'"}]
],
"undo": [
["ModifyColumn", "Address", "city", {"formula": ""}],
["UpdateRecord", "_grist_Tables_column", 21, {"formula": ""}]
]
}
}],
["APPLY", {
// Modifying formulas and triggering calc actions
"USER_ACTION": ["ModifyColumn", "Students", "fullName", {
"formula": "rec.lastName + ' - ' + rec.firstName"
}],
"ACTIONS": {
"stored": [
["ModifyColumn", "Students", "fullName",
{"formula": "rec.lastName + ' - ' + rec.firstName"}],
["UpdateRecord", "_grist_Tables_column", 3,
{"formula": "rec.lastName + ' - ' + rec.firstName"}],
["BulkUpdateRecord", "Students", [1,2,3,4,5,6,8], {
"fullName": [
"Obama - Barack",
"Bush - George W",
"Clinton - Bill",
"Bush - George H",
"Reagan - Ronald",
"Carter - Jimmy",
"Ford - Gerald"
]
}],
["BulkUpdateRecord", "Students", [1,2,3,4,5,6,8], {
"fullNameLen": [14,15,14,15,15,14,13]
}]
],
"undo": [
["ModifyColumn", "Students", "fullName",
{"formula": "rec.firstName + ' ' + rec.lastName"}],
["UpdateRecord", "_grist_Tables_column", 3,
{"formula": "rec.firstName + ' ' + rec.lastName"}],
["BulkUpdateRecord", "Students", [1, 2, 3, 4, 5, 6, 8],
{"fullName": ["Barack Obama", "George W Bush", "Bill Clinton", "George H Bush", "Ronald Reagan", "Jimmy Carter", "Gerald Ford"]}],
["BulkUpdateRecord", "Students", [1, 2, 3, 4, 5, 6, 8],
{"fullNameLen": [12, 13, 12, 13, 13, 12, 11]}]
]
},
"CHECK_CALL_COUNTS" : {
"Students" : { "fullName" : 7, "fullNameLen" : 7 }
}
}],
["APPLY", {
"USER_ACTIONS": [
// Check that Default formulas are triggered on add record
["UpdateRecord", "Students", 2, {"firstName": "G.W."}],
["AddRecord", "Address", 11, {"country": "US"}]
],
"ACTIONS": {
"stored": [
["UpdateRecord", "Students", 2, {"firstName": "G.W."}],
["AddRecord", "Address", 11, {"country": "US"}],
["UpdateRecord", "Address", 11, {"city": "Anytown"}],
["UpdateRecord", "Address", 11, {"region": "North America" }],
["UpdateRecord", "Students", 2, {"fullName": "Bush - G.W."}],
["UpdateRecord", "Students", 2, {"fullNameLen": 11}]
],
"undo": [
["UpdateRecord", "Students", 2, {"firstName": "George W"}],
["RemoveRecord", "Address", 11],
["UpdateRecord", "Students", 2, {"fullName": "Bush - George W"}],
["UpdateRecord", "Students", 2, {"fullNameLen": 15}]
]
},
"CHECK_CALL_COUNTS" : {
"Address" : { "city": 1, "region" : 1 },
"Students": { "fullName" : 1, "fullNameLen" : 1 }
}
}],
["APPLY", {
"USER_ACTIONS": [
// Check that nothing bad happens when going back and forth between types
// in a formula column
["ModifyColumn", "Students", "fullNameLen", {"type": "Text"}],
["ModifyColumn", "Students", "fullNameLen", {"type": "Int"}],
["ModifyColumn", "Students", "fullNameLen", {"type": "Any"}]
],
"ACTIONS": {
"stored": [
["ModifyColumn", "Students", "fullNameLen",
{"type": "Text"}],
["UpdateRecord", "_grist_Tables_column", 4,
{"type": "Text"}],
["ModifyColumn", "Students", "fullNameLen",
{"type": "Int"}],
["UpdateRecord", "_grist_Tables_column", 4,
{"type": "Int"}],
["ModifyColumn", "Students", "fullNameLen",
{"type": "Any"}],
["UpdateRecord", "_grist_Tables_column", 4,
{"type": "Any"}]
],
"undo": [
["ModifyColumn", "Students", "fullNameLen",
{"type": "Any"}],
["UpdateRecord", "_grist_Tables_column", 4,
{"type": "Any"}],
["ModifyColumn", "Students", "fullNameLen",
{"type": "Text"}],
["UpdateRecord", "_grist_Tables_column", 4,
{"type": "Text"}],
["ModifyColumn", "Students", "fullNameLen",
{"type": "Int"}],
["UpdateRecord", "_grist_Tables_column", 4,
{"type": "Int"}]
]
},
"CHECK_CALL_COUNTS" : {
"Students" : { "fullNameLen" : 7 }
}
}],
["APPLY", {
"USER_ACTIONS": [
// Check that nothing bad happens when going back and forth between formula
// and non-formula
["ModifyColumn", "Students", "fullNameLen", {"isFormula": false, "type": "Int"}],
["ModifyColumn", "Students", "fullNameLen", {"isFormula": true, "formula" : "len($fullName) - 1"}],
["ModifyColumn", "Students", "fullNameLen", {"isFormula": false}]
],
"ACTIONS": {
"stored": [
["ModifyColumn", "Students", "fullNameLen",
{"isFormula": false, "type": "Int"}],
["UpdateRecord", "_grist_Tables_column", 4,
{"isFormula": false, "type": "Int"}],
["ModifyColumn", "Students", "fullNameLen",
{"formula": "len($fullName) - 1", "isFormula": true}],
["UpdateRecord", "_grist_Tables_column", 4,
{"formula": "len($fullName) - 1", "isFormula": true}],
["ModifyColumn", "Students", "fullNameLen", {"isFormula": false}],
["BulkUpdateRecord", "Students", [1, 2, 3, 4, 5, 6, 8],
{"fullNameLen": [13, 10, 13, 14, 14, 13, 12]}],
["UpdateRecord", "_grist_Tables_column", 4, {"isFormula": false}]
],
"undo": [
["ModifyColumn", "Students", "fullNameLen",
{"isFormula": true, "type": "Any"}],
["UpdateRecord", "_grist_Tables_column", 4,
{"isFormula": true, "type": "Any"}],
["ModifyColumn", "Students", "fullNameLen",
{"isFormula": false, "formula" : "len(rec.fullName)"}],
["UpdateRecord", "_grist_Tables_column", 4,
{"isFormula": false, "formula" : "len(rec.fullName)"}],
["BulkUpdateRecord", "Students", [1, 2, 3, 4, 5, 6, 8],
{"fullNameLen": [14, 11, 14, 15, 15, 14, 13]}],
["ModifyColumn", "Students", "fullNameLen", {"isFormula": true}],
["UpdateRecord", "_grist_Tables_column", 4, {"isFormula": true}]
]
},
"CHECK_CALL_COUNTS" : {
"Students" : { "fullNameLen" : 7 }
}
}],
// XXX
["CHECK_OUTPUT", {
"USE_SAMPLE": "basic",
"Students": [
["id","firstName","lastName","school","@fullName","fullNameLen","@schoolShort",
"@schoolRegion"],
[1, "Barack", "Obama", 2, "Obama - Barack", 13, "Columbia", "NY"],
[2, "G.W.", "Bush", 8, "Bush - G.W.", 10, "Yale", "CT"],
[3, "Bill", "Clinton", 6, "Clinton - Bill", 13, "Oxford", "Europe"],
[4, "George H", "Bush", 8, "Bush - George H",14, "Yale", "CT"],
[5, "Ronald", "Reagan", 1, "Reagan - Ronald",14, "Eureka", "IL"],
[6, "Jimmy", "Carter", 5, "Carter - Jimmy", 13, "U.S.", "MD"],
[8, "Gerald", "Ford", 7, "Ford - Gerald", 12, "Yale", "CT"]],
"Address": [
["id", "city", "state", "country", "@region"],
[2, "Eureka", "IL", "US", "North America"],
[3, "Annapolis", "MD", "US", "North America"],
[4, "New Haven", "CT", "US", "North America"],
[7, "New York", "NY", "US", "North America"],
[10, "Oxford", "England", "UK", "Europe"],
[11, "Anytown", "", "US", "North America"]]
}],
["APPLY", {
"USER_ACTIONS": [
// Modifying types converts some values, leaves others as alttext.
["UpdateRecord", "Address", 2, {"city" : "567"}],
["ModifyColumn", "Address", "city", {"type" : "Int"}]
],
"ACTIONS": {
"stored": [
["UpdateRecord", "Address", 2, {"city" : "567"}],
["ModifyColumn", "Address", "city", {"type" : "Int"}],
["UpdateRecord", "Address", 2, {"city" : 567}],
["UpdateRecord", "_grist_Tables_column", 21, {"type" : "Int"}]
],
"undo" : [
["UpdateRecord", "Address", 2, {"city": "Eureka"}],
["UpdateRecord", "Address", 2, {"city" : "567"}],
["ModifyColumn", "Address", "city", {"type": "Text"}],
["UpdateRecord", "_grist_Tables_column", 21, {"type": "Text"}]
]
}
}],
["APPLY", {
"USER_ACTION": [
// Updating a record creates alttext strings properly
"UpdateRecord", "Address", 2, {"city": "Eureka"}
],
"ACTIONS": {
"stored": [["UpdateRecord", "Address", 2, {"city": "Eureka"}]],
"undo" : [["UpdateRecord", "Address", 2, {"city" : 567}]]
}
}],
["APPLY", {
"USER_ACTIONS": [
// Modify Column type conversion in a case there the entire column is "ok"
["ModifyColumn", "Address", "city", { "type" : "Text" }],
["BulkUpdateRecord", "Address", [2,3,4,7,10, 11], {"city": ["7","7","7","7","7", "7"] }],
["ModifyColumn", "Address", "city", { "type" : "Int" }]
],
"ACTIONS" : {
"stored": [
["ModifyColumn", "Address", "city", {"type": "Text"}],
["UpdateRecord", "_grist_Tables_column", 21, {"type": "Text"}],
["BulkUpdateRecord", "Address", [2, 3, 4, 7, 10, 11], {"city": ["7", "7", "7", "7", "7", "7"]}],
["ModifyColumn", "Address", "city", {"type": "Int"}],
["BulkUpdateRecord", "Address", [2, 3, 4, 7, 10, 11], {"city": [7, 7, 7, 7, 7, 7]}],
["UpdateRecord", "_grist_Tables_column", 21, {"type": "Int"}]
],
"undo": [
["ModifyColumn", "Address", "city", {"type": "Int"}],
["UpdateRecord", "_grist_Tables_column", 21, {"type": "Int"}],
["BulkUpdateRecord", "Address", [2, 3, 4, 7, 10, 11], {"city": ["Eureka", "Annapolis", "New Haven", "New York", "Oxford", "Anytown"]}],
["BulkUpdateRecord", "Address", [2, 3, 4, 7, 10, 11], {"city": ["7", "7", "7", "7", "7", "7"]}],
["ModifyColumn", "Address", "city", {"type": "Text"}],
["UpdateRecord", "_grist_Tables_column", 21, {"type": "Text"}]
]
}
}],
["CHECK_OUTPUT", {
"USE_SAMPLE": "basic",
"Students": [
["id","firstName","lastName","school","@fullName","fullNameLen","@schoolShort",
"@schoolRegion"],
[1, "Barack", "Obama", 2, "Obama - Barack", 13, "Columbia", "NY"],
[2, "G.W.", "Bush", 8, "Bush - G.W.", 10, "Yale", "CT"],
[3, "Bill", "Clinton", 6, "Clinton - Bill", 13, "Oxford", "Europe"],
[4, "George H", "Bush", 8, "Bush - George H",14, "Yale", "CT"],
[5, "Ronald", "Reagan", 1, "Reagan - Ronald",14, "Eureka", "IL"],
[6, "Jimmy", "Carter", 5, "Carter - Jimmy", 13, "U.S.", "MD"],
[8, "Gerald", "Ford", 7, "Ford - Gerald", 12, "Yale", "CT"]],
"Address": [
["id", "city", "state", "country", "@region"],
[2, 7, "IL", "US", "North America"],
[3, 7, "MD", "US", "North America"],
[4, 7, "CT", "US", "North America"],
[7, 7, "NY", "US", "North America"],
[10, 7, "England", "UK", "Europe"],
[11, 7, "", "US", "North America"]]
}],
["APPLY", {
// Check that turning a non-formula column, with no formula, into a formula
// works as expected
"USER_ACTION" : ["ModifyColumn", "Address", "state", { "isFormula" : true, "type": "Any" }],
"ACTIONS" : {
"stored" : [
["ModifyColumn", "Address", "state", {"isFormula": true, "type": "Any"}],
["UpdateRecord", "_grist_Tables_column", 27, {"isFormula": true, "type": "Any"}],
["BulkUpdateRecord", "Address", [2, 3, 4, 7, 10, 11], {"state": [null, null, null, null, null, null]}],
["BulkUpdateRecord", "Students", [1, 2, 4, 5, 6, 8], {"schoolRegion": [null, null, null, null, null, null]}]
],
"undo" : [
["ModifyColumn", "Address", "state", {"isFormula": false, "type": "Text"}],
["UpdateRecord", "_grist_Tables_column", 27, {"isFormula": false, "type": "Text"}],
["BulkUpdateRecord", "Address", [2, 3, 4, 7, 10, 11],
{"state": ["IL", "MD", "CT", "NY", "England", ""]}],
["BulkUpdateRecord", "Students", [1, 2, 4, 5, 6, 8], {"schoolRegion": ["NY", "CT", "CT", "IL", "MD", "CT"]}]
]
},
"CHECK_CALL_COUNTS" : {
"Address" : { "state" : 6 },
"Students" : { "schoolRegion" : 7 }
}
}],
["APPLY", {
// Property generation
"USER_ACTION": ["UpdateRecord", "Students", 1, {"fullNameLen" : "Fourteen"}],
"ACTIONS" : {
"stored" : [["UpdateRecord", "Students", 1, {"fullNameLen": "Fourteen"}]],
"undo" : [["UpdateRecord", "Students", 1, {"fullNameLen": 13}]]
}
}],
["APPLY", {
// Check formula error handling
"USER_ACTIONS" : [
["ModifyColumn", "Students", "fullName", {"formula" : "!#@%&T#$UDSAIKVFsdhifzsk" }],
["ModifyColumn", "Students", "schoolRegion", {"formula" : "5*len($firstName) / $fullNameLen" }]
],
"ACTIONS" : {
"stored" : [
["ModifyColumn", "Students", "fullName", {"formula": "!#@%&T#$UDSAIKVFsdhifzsk"}],
["UpdateRecord", "_grist_Tables_column", 3, {"formula": "!#@%&T#$UDSAIKVFsdhifzsk"}],
["ModifyColumn", "Students", "schoolRegion", {"formula": "5*len($firstName) / $fullNameLen"}],
["UpdateRecord", "_grist_Tables_column", 9, {"formula": "5*len($firstName) / $fullNameLen"}],
["BulkUpdateRecord", "Students", [1, 2, 3, 4, 5, 6, 8],
{"fullName" : [["E","SyntaxError"], ["E","SyntaxError"], ["E","SyntaxError"],
["E","SyntaxError"], ["E","SyntaxError"], ["E","SyntaxError"], ["E","SyntaxError"]]
}],
// In previous section, we set $fullNameLen to the string "Fourteen" for Student #1, so
// the calculation for that record fails with TypeError.
["BulkUpdateRecord", "Students", [1, 2, 3, 4, 5, 6, 8],
{"schoolRegion": [["E", "TypeError"], 2, 1, 2, 2, 1, 2]}]
],
"undo" : [
["ModifyColumn", "Students", "fullName", {"formula": "rec.lastName + ' - ' + rec.firstName"}],
["UpdateRecord", "_grist_Tables_column", 3, {"formula": "rec.lastName + ' - ' + rec.firstName"}],
["ModifyColumn", "Students", "schoolRegion",
{"formula": "addr = $school.address\naddr.state if addr.country == 'US' else addr.region"}],
["UpdateRecord", "_grist_Tables_column", 9,
{"formula": "addr = $school.address\naddr.state if addr.country == 'US' else addr.region"}],
["BulkUpdateRecord", "Students", [1, 2, 3, 4, 5, 6, 8],
{"fullName": ["Obama - Barack", "Bush - G.W.", "Clinton - Bill", "Bush - George H", "Reagan - Ronald", "Carter - Jimmy", "Ford - Gerald"]}],
["BulkUpdateRecord", "Students", [1, 2, 3, 4, 5, 6, 8],
{"schoolRegion": [null, null, "Europe", null, null, null, null]}]
]
},
"CHECK_CALL_COUNTS" : {
"Students" : { "schoolRegion" : 7, "fullName" : 7 }
}
}],
["APPLY", {
// Check that error handling works properly when evaluating a no-longer
// error-full formula
"USER_ACTION" :
["ModifyColumn", "Students", "fullName", {"formula" : "$firstName"}],
"ACTIONS" : {
"stored" : [
["ModifyColumn", "Students", "fullName", {"formula": "$firstName"}],
["UpdateRecord", "_grist_Tables_column", 3, {"formula": "$firstName"}],
["BulkUpdateRecord", "Students", [1, 2, 3, 4, 5, 6, 8],
{"fullName": ["Barack", "G.W.", "Bill", "George H", "Ronald", "Jimmy", "Gerald"]}]
],
"undo" : [
["ModifyColumn", "Students", "fullName", {"formula": "!#@%&T#$UDSAIKVFsdhifzsk"}],
["UpdateRecord", "_grist_Tables_column", 3, {"formula": "!#@%&T#$UDSAIKVFsdhifzsk"}],
["BulkUpdateRecord", "Students", [1, 2, 3, 4, 5, 6, 8],
{"fullName": [["E", "SyntaxError"], ["E", "SyntaxError"], ["E", "SyntaxError"], ["E", "SyntaxError"], ["E", "SyntaxError"], ["E", "SyntaxError"], ["E", "SyntaxError"]]}]
]
}
}],
["CHECK_OUTPUT", {
"USE_SAMPLE": "basic",
"Students": [
["id","firstName","lastName","school","@fullName","fullNameLen","@schoolShort",
"@schoolRegion"],
[1, "Barack", "Obama", 2, "Barack", "Fourteen", "Columbia", ["E","TypeError"]],
[2, "G.W.", "Bush", 8, "G.W.", 10, "Yale", 2],
[3, "Bill", "Clinton", 6, "Bill", 13, "Oxford", 1],
[4, "George H", "Bush", 8, "George H", 14, "Yale", 2],
[5, "Ronald", "Reagan", 1, "Ronald", 14, "Eureka", 2],
[6, "Jimmy", "Carter", 5, "Jimmy", 13, "U.S.", 1],
[8, "Gerald", "Ford", 7, "Gerald", 12, "Yale", 2]],
"Address": [
["id", "city", "@state", "country", "@region"],
[2, 7, null, "US", "North America"],
[3, 7, null, "US", "North America"],
[4, 7, null, "US", "North America"],
[7, 7, null, "US", "North America"],
[10, 7, null, "UK", "Europe"],
[11, 7, null, "US", "North America"]]
}],
["APPLY", {
// Check that ModifyColumn properly handles noops on redundant updates
"USER_ACTIONS" : [
["ModifyColumn", "Students", "fullName", {"isFormula" : true }],
["UpdateRecord", "_grist_Tables_column", 3, { "formula" : "$firstName" }],
["ModifyColumn", "Students", "fullName",
{"isFormula" : true, "formula" : "$firstName", "label": "Entire Name"}]
],
"ACTIONS" : {
"stored" : [
["RenameColumn", "Students", "fullName", "Entire_Name"],
["ModifyColumn", "Students", "fullNameLen", {
"formula": "len($Entire_Name) - 1"
}],
["BulkUpdateRecord", "_grist_Tables_column", [3, 4], {
"label": ["Entire Name", "Full Name Length"],
"colId": ["Entire_Name", "fullNameLen"],
"formula": ["$firstName", "len($Entire_Name) - 1"]
}]
],
"undo" : [
["RenameColumn", "Students", "Entire_Name", "fullName"],
["ModifyColumn", "Students", "fullNameLen", {
"formula": "len($fullName) - 1"
}],
["BulkUpdateRecord", "_grist_Tables_column", [3, 4], {
"label": ["Full Name", "Full Name Length"],
"colId": ["fullName", "fullNameLen"],
"formula": ["$firstName", "len($fullName) - 1"]
}]
]
}
}]
]
}, {
//----------------------------------------------------------------------
"TEST_CASE": "column_conversions",
//----------------------------------------------------------------------
"BODY": [
["LOAD_SAMPLE", "simplest"],
["CHECK_OUTPUT", {"USE_SAMPLE": "simplest"}],
["APPLY", {
// Add a DateTime column
"USER_ACTION": ["AddColumn", "foo", "c_date", {"type": "DateTime", "isFormula": false}],
"ACTIONS": {
"stored": [
["AddColumn", "foo", "c_date", {
"type": "DateTime",
"isFormula": false,
"formula": ""
}],
["AddRecord", "_grist_Tables_column", 2, {
"colId": "c_date", "formula": "", "isFormula": false, "label": "c_date", "parentId": 1,
"parentPos": 2.0, "type": "DateTime", "widgetOptions": ""}
]
],
"undo": [
["RemoveColumn", "foo", "c_date"],
["RemoveRecord", "_grist_Tables_column", 2]
]
}
}],
["CHECK_OUTPUT", {
"USE_SAMPLE": "simplest",
"foo": [
["id", "bar", "c_date"],
[1, "apple", null]
]
}],
["APPLY", {
// Change it to Int
"USER_ACTION": ["ModifyColumn", "foo", "c_date", {"type": "Int"}],
"ACTIONS": {
"stored": [
["ModifyColumn", "foo", "c_date", {"type": "Int"}],
["UpdateRecord", "_grist_Tables_column", 2, {"type": "Int"}]
],
"undo": [
["ModifyColumn", "foo", "c_date", {"type": "DateTime"}],
["UpdateRecord", "_grist_Tables_column", 2, {"type": "DateTime"}]
]
}
}],
["CHECK_OUTPUT", {
"USE_SAMPLE": "simplest",
"foo": [
["id", "bar", "c_date"],
[1, "apple", null]
]
}],
["APPLY", {
// Change it to Numeric
"USER_ACTION": ["ModifyColumn", "foo", "c_date", {"type": "Numeric"}],
"ACTIONS": {
"stored": [
["ModifyColumn", "foo", "c_date", {"type": "Numeric"}],
["UpdateRecord", "_grist_Tables_column", 2, {"type": "Numeric"}]
],
"undo": [
["ModifyColumn", "foo", "c_date", {"type": "Int"}],
["UpdateRecord", "_grist_Tables_column", 2, {"type": "Int"}]
]
}
}],
["CHECK_OUTPUT", {
"USE_SAMPLE": "simplest",
"foo": [
["id", "bar", "c_date"],
[1, "apple", null]
]
}],
["APPLY", {
// Change it back to DateTime
"USER_ACTION": ["ModifyColumn", "foo", "c_date", {"type": "DateTime"}],
"ACTIONS": {
"stored": [
// Note absence of UpdateRecord for 0 to null, because 0 is compatible with DateTime
["ModifyColumn", "foo", "c_date", {"type": "DateTime"}],
["UpdateRecord", "_grist_Tables_column", 2, {"type": "DateTime"}]
],
"undo": [
["ModifyColumn", "foo", "c_date", {"type": "Numeric"}],
["UpdateRecord", "_grist_Tables_column", 2, {"type": "Numeric"}]
]
}
}],
["CHECK_OUTPUT", {
"USE_SAMPLE": "simplest",
"foo": [
["id", "bar", "c_date"],
[1, "apple", null]
]
}]
]
}, {
//----------------------------------------------------------------------
"TEST_CASE": "add_table",
//----------------------------------------------------------------------
"BODY": [
["LOAD_SAMPLE", "basic"],
["APPLY", {
"USER_ACTIONS": [
["AddTable", "Foo", []],
["AddTable", "Bar", [
{ "id": "hello", "label": "hello", "type": "Text", "isFormula": false, "widgetOptions": ""},
{ "id": "world", "label": "world", "type": "Text", "isFormula": true, "formula": "rec.hello.upper()", "widgetOptions": ""},
{ "id": "foo", "label": "foo", "type": "Ref:Foo", "isFormula": false, "widgetOptions": "" }
]],
["AddRecord", "Bar", 1, {"hello": "a", "foo": 0}],
["AddRecord", "Bar", 2, {"hello": "b", "foo": 1}],
["AddRecord", "Bar", 3, {"hello": "c", "foo": 1}]
],
"ACTIONS": {
"stored": [
["AddTable", "Foo", [
{"id": "manualSort", "formula": "", "isFormula": false, "type": "ManualSortPos"}
]],
["AddRecord", "_grist_Tables", 4, {"primaryViewId": 0, "tableId": "Foo"}],
["AddRecord", "_grist_Tables_column", 30, {"colId": "manualSort", "formula": "", "isFormula": false,
"label": "manualSort", "parentId": 4, "parentPos": 8.0, "type": "ManualSortPos", "widgetOptions": ""}],
// Raw view
["AddRecord", "_grist_Views", 1,
{"type": "raw_data", "name": "Foo"}],
["AddRecord", "_grist_TabBar", 1, {"tabPos": 1.0, "viewRef": 1}],
["AddRecord", "_grist_Pages", 1, {"indentation": 0, "pagePos": 1.0, "viewRef": 1}],
["AddRecord", "_grist_Views_section", 1,
{"tableRef": 4, "defaultWidth": 100, "borderWidth": 1,
"parentId": 1, "parentKey": "record", "sortColRefs": "[]", "title": ""}],
["UpdateRecord", "_grist_Tables", 4, {"primaryViewId": 1}],
["AddTable", "Bar", [
{"id": "manualSort", "formula": "", "isFormula": false, "type": "ManualSortPos"},
{"isFormula": false, "formula": "", "type": "Text", "id": "hello"},
{"isFormula": true, "formula": "rec.hello.upper()", "type": "Text", "id": "world"},
{"isFormula": false, "formula": "", "type": "Ref:Foo", "id": "foo"}]
],
["AddRecord", "_grist_Tables", 5, {"primaryViewId": 0, "tableId": "Bar"}],
["BulkAddRecord", "_grist_Tables_column", [31,32,33,34], {
"colId": ["manualSort","hello","world","foo"],
"isFormula": [false,false,true,false],
"formula": ["","","rec.hello.upper()",""],
"type": ["ManualSortPos","Text","Text","Ref:Foo"],
"label": ["manualSort","hello","world","foo"],
"parentId": [5,5,5,5],
"parentPos": [9.0,10.0,11.0,12.0],
"widgetOptions": ["","","",""]
}],
["AddRecord", "_grist_Views", 2,
{"type": "raw_data", "name": "Bar"}],
["AddRecord", "_grist_TabBar", 2, {"tabPos": 2.0, "viewRef": 2}],
["AddRecord", "_grist_Pages", 2, {"pagePos": 2.0, "viewRef": 2, "indentation": 0}],
["AddRecord", "_grist_Views_section", 2,
{"tableRef": 5, "defaultWidth": 100, "borderWidth": 1,
"parentId": 2, "parentKey": "record", "sortColRefs": "[]", "title": ""}],
["BulkAddRecord", "_grist_Views_section_field", [1,2,3],
{"parentId": [2,2,2], "colRef": [32,33,34], "parentPos": [1.0,2.0,3.0]}],
["UpdateRecord", "_grist_Tables", 5, {"primaryViewId": 2}],
["AddRecord", "Bar", 1, {"foo": 0, "hello": "a", "manualSort": 1.0}],
["AddRecord", "Bar", 2, {"foo": 1, "hello": "b", "manualSort": 2.0}],
["AddRecord", "Bar", 3, {"foo": 1, "hello": "c", "manualSort": 3.0}],
["BulkUpdateRecord", "Bar", [1, 2, 3], {"world": ["A", "B", "C"]}]
],
"undo": [
["RemoveTable", "Foo"],
["RemoveRecord", "_grist_Tables", 4],
["RemoveRecord", "_grist_Tables_column", 30],
["RemoveRecord", "_grist_Views", 1],
["RemoveRecord", "_grist_TabBar", 1],
["RemoveRecord", "_grist_Pages", 1],
["RemoveRecord", "_grist_Views_section", 1],
["UpdateRecord", "_grist_Tables", 4, {"primaryViewId": 0}],
["RemoveTable", "Bar"],
["RemoveRecord", "_grist_Tables", 5],
["BulkRemoveRecord", "_grist_Tables_column", [31,32,33,34]],
["RemoveRecord", "_grist_Views", 2],
["RemoveRecord", "_grist_TabBar", 2],
["RemoveRecord", "_grist_Pages", 2],
["RemoveRecord", "_grist_Views_section", 2],
["BulkRemoveRecord", "_grist_Views_section_field", [1,2,3]],
["UpdateRecord", "_grist_Tables", 5, {"primaryViewId": 0}],
["RemoveRecord", "Bar", 1],
["RemoveRecord", "Bar", 2],
["RemoveRecord", "Bar", 3]
],
"retValue": [
// AddTable "Foo" retValue
{
"table_id": "Foo",
"id": 4,
"columns": [],
"views": [
{ "sections": [ 1 ], "id": 1 }
]
},
// AddTable "Bar" retValue
{
"table_id": "Bar",
"id": 5,
"columns": ["hello", "world", "foo"],
"views": [
{ "sections": [ 2 ], "id": 2 }
]
},
// AddRecord retValues
1, 2, 3
]
},
"CHECK_CALL_COUNTS": {
//"Bar" : { "world" : 3 }
}
}],
["CHECK_OUTPUT", {
"USE_SAMPLE": "basic",
"Foo": [
["id", "manualSort"]
],
"Bar": [
["id", "hello", "foo", "manualSort", "@world"],
[1, "a", 0, 1.0, "A"],
[2, "b", 1, 2.0, "B"],
[3, "c", 1, 3.0, "C"]
]
}]
]
}, {
//----------------------------------------------------------------------
"TEST_CASE": "remove_table",
//----------------------------------------------------------------------
"BODY": [
["LOAD_SAMPLE", "basic"],
["APPLY", {
"USER_ACTION": ["AddTable", "Foo", []],
"ACTIONS": {
"stored": [
["AddTable", "Foo", [{"id": "manualSort", "formula": "",
"isFormula": false, "type": "ManualSortPos"}]],
["AddRecord", "_grist_Tables", 4, {"primaryViewId": 0, "tableId": "Foo"}],
["AddRecord", "_grist_Tables_column", 30, {"colId": "manualSort", "formula": "", "isFormula": false,
"label": "manualSort", "parentId": 4, "parentPos": 8.0, "type": "ManualSortPos", "widgetOptions": ""}],
// Raw view
["AddRecord", "_grist_Views", 1,
{"type": "raw_data", "name": "Foo"}],
["AddRecord", "_grist_TabBar", 1, {"tabPos": 1.0, "viewRef": 1}],
["AddRecord", "_grist_Pages", 1, {"pagePos": 1.0, "viewRef": 1, "indentation": 0}],
["AddRecord", "_grist_Views_section", 1,
{"tableRef": 4, "defaultWidth": 100, "borderWidth": 1,
"parentId": 1, "parentKey": "record", "sortColRefs": "[]", "title": ""}],
// As part of adding a table, we also set the primaryViewId.
["UpdateRecord", "_grist_Tables", 4, {"primaryViewId": 1}]
],
"undo": [
["RemoveTable", "Foo"],
["RemoveRecord", "_grist_Tables", 4],
["RemoveRecord", "_grist_Tables_column", 30],
["RemoveRecord", "_grist_Views", 1],
["RemoveRecord", "_grist_TabBar", 1],
["RemoveRecord", "_grist_Pages", 1],
["RemoveRecord", "_grist_Views_section", 1],
["UpdateRecord", "_grist_Tables", 4, {"primaryViewId": 0}]
]
}
}],
["CHECK_OUTPUT", {
"USE_SAMPLE": "basic",
"Foo": [["id", "manualSort"]]
}],
["APPLY", {
"USER_ACTION": ["RemoveTable", "Foo"],
"ACTIONS": {
"stored": [
["RemoveRecord", "_grist_Views_section", 1],
["RemoveRecord", "_grist_TabBar", 1],
["RemoveRecord", "_grist_Pages", 1],
["RemoveRecord", "_grist_Views", 1],
["UpdateRecord", "_grist_Tables", 4, {"primaryViewId": 0}],
["RemoveRecord", "_grist_Tables_column", 30],
["RemoveRecord", "_grist_Tables", 4],
["RemoveTable", "Foo"]
],
"undo": [
["AddRecord", "_grist_Views_section", 1,
{"tableRef": 4, "defaultWidth": 100, "borderWidth": 1,
"parentId": 1, "parentKey": "record", "sortColRefs": "[]"}],
["AddRecord", "_grist_TabBar", 1, {"tabPos": 1.0, "viewRef": 1}],
["AddRecord", "_grist_Pages", 1, {"pagePos": 1.0, "viewRef": 1}],
["AddRecord", "_grist_Views", 1, {"name": "Foo", "type": "raw_data"}],
["UpdateRecord", "_grist_Tables", 4, {"primaryViewId": 1}],
["AddRecord", "_grist_Tables_column", 30,
{"colId": "manualSort",
"label": "manualSort", "parentId": 4, "parentPos": 8.0,
"type": "ManualSortPos"}],
["AddRecord", "_grist_Tables", 4, {"tableId": "Foo"}],
["AddTable", "Foo", [{"formula": "",
"id": "manualSort", "isFormula": false, "type": "ManualSortPos"}]]
]
}
}],
["CHECK_OUTPUT",
{"USE_SAMPLE": "basic"}
],
// When there is a Reference column to a deleted table, the reference column is also deleted.
["APPLY", {
"USER_ACTION": ["RemoveTable", "Schools"],
"ACTIONS": {
"stored": [
// Assert that calc actions include a RemoveColumn for Students.school
["RemoveRecord", "_grist_Tables_column", 5],
["RemoveColumn", "Students", "school"],
["BulkRemoveRecord", "_grist_Tables_column", [10, 12]],
["RemoveRecord", "_grist_Tables", 2],
["RemoveTable", "Schools"],
// Assert that calc actions include a RemoveColumn for Students.school
["BulkUpdateRecord", "Students", [1, 2, 3, 4, 5, 6, 8],
{"schoolRegion": [["E","AttributeError"], ["E","AttributeError"],
["E","AttributeError"], ["E","AttributeError"], ["E","AttributeError"],
["E","AttributeError"], ["E","AttributeError"]]
}],
["BulkUpdateRecord", "Students", [1, 2, 3, 4, 5, 6, 8],
{"schoolShort": [["E","AttributeError"], ["E","AttributeError"],
["E","AttributeError"], ["E","AttributeError"], ["E","AttributeError"],
["E","AttributeError"], ["E","AttributeError"]]
}]
],
"undo": [
["AddRecord", "_grist_Tables_column", 5,
{"parentPos": 5.0, "parentId": 1,
"colId": "school", "type": "Ref:Schools", "label": "school"}],
["BulkUpdateRecord", "Students", [1, 2, 3, 4, 5, 6, 8],
{"school": [2, 8, 6, 8, 1, 5, 7]}],
["AddColumn", "Students", "school", {"isFormula": false, "formula": "", "type": "Ref:Schools"}],
["BulkAddRecord", "_grist_Tables_column", [10, 12], {
"colId": ["name", "address"],
"label": ["Name", "Address"], "parentId": [2, 2], "parentPos": [1.0, 2.0],
"type": ["Text", "Ref:Address"]
}],
["AddRecord", "_grist_Tables", 2, {"tableId": "Schools"}],
["BulkAddRecord", "Schools", [1, 2, 5, 6, 7, 8],
{"name": [
"Eureka College", "Columbia University", "U.S. Naval Academy",
"Oxford University", "Yale Law School", "Yale University"],
"address": [2, 7, 3, 10, 4, 4]}],
["AddTable", "Schools", [
{"isFormula": false, "formula": "", "type": "Text", "id": "name"},
{"isFormula": false, "formula": "", "type": "Ref:Address", "id": "address"}]
],
["BulkUpdateRecord", "Students", [1, 2, 3, 4, 5, 6, 8], {"schoolRegion": ["NY", "CT", "Europe", "CT", "IL", "MD", "CT"]}],
["BulkUpdateRecord", "Students", [1, 2, 3, 4, 5, 6, 8], {"schoolShort": ["Columbia", "Yale", "Oxford", "Yale", "Eureka", "U.S.", "Yale"]}]
]
},
"CHECK_CALL_COUNTS" : {
"Students" : { "schoolRegion" : 7, "schoolShort" : 7 }
}
}],
["CHECK_OUTPUT", {
"Students": [
["id","firstName","lastName","@fullName","@fullNameLen","@schoolShort","@schoolRegion"],
[1, "Barack", "Obama", "Barack Obama", 12, ["E","AttributeError"], ["E","AttributeError"]],
[2, "George W", "Bush", "George W Bush",13, ["E","AttributeError"], ["E","AttributeError"]],
[3, "Bill", "Clinton", "Bill Clinton", 12, ["E","AttributeError"], ["E","AttributeError"]],
[4, "George H", "Bush", "George H Bush",13, ["E","AttributeError"], ["E","AttributeError"]],
[5, "Ronald", "Reagan", "Ronald Reagan",13, ["E","AttributeError"], ["E","AttributeError"]],
[6, "Jimmy", "Carter", "Jimmy Carter", 12, ["E","AttributeError"], ["E","AttributeError"]],
[8, "Gerald", "Ford", "Gerald Ford", 11, ["E","AttributeError"], ["E","AttributeError"]]],
"Address": [
["id", "city", "state", "country", "@region"],
[2, "Eureka", "IL", "US", "North America"],
[3, "Annapolis", "MD", "US", "North America"],
[4, "New Haven", "CT", "US", "North America"],
[7, "New York", "NY", "US", "North America"],
[10, "Oxford", "England", "UK", "Europe"]]
}],
["APPLY", {
"USER_ACTION": ["RemoveTable", "Students"],
"ACTIONS": {
"stored": [
["BulkRemoveRecord", "_grist_Tables_column", [1, 2, 3, 4, 6, 9]],
["RemoveRecord", "_grist_Tables", 1],
["RemoveTable", "Students"]
],
"undo": [
["BulkAddRecord", "_grist_Tables_column", [1, 2, 3, 4, 6, 9], {
"colId": ["firstName", "lastName", "fullName", "fullNameLen", "schoolShort",
"schoolRegion"],
"formula": ["", "", "rec.firstName + ' ' + rec.lastName", "len(rec.fullName)",
"rec.school.name.split(' ')[0]",
"addr = $school.address\naddr.state if addr.country == 'US' else addr.region"],
"isFormula": [false, false, true, true, true, true],
"label": ["First Name", "Last Name", "Full Name", "Full Name Length", "School Short",
"School Region"],
"parentId": [1, 1, 1, 1, 1, 1], "parentPos": [1, 2, 3, 4, 6, 7],
"type": ["Text", "Text", "Any", "Any", "Any", "Any"]
}],
["AddRecord", "_grist_Tables", 1, {"tableId": "Students"}],
["BulkAddRecord", "Students", [1, 2, 3, 4, 5, 6, 8], {
"firstName": ["Barack", "George W", "Bill", "George H", "Ronald", "Jimmy", "Gerald"],
"fullName": ["Barack Obama", "George W Bush", "Bill Clinton", "George H Bush", "Ronald Reagan", "Jimmy Carter", "Gerald Ford"],
"fullNameLen": [12, 13, 12, 13, 13, 12, 11],
"lastName": ["Obama", "Bush", "Clinton", "Bush", "Reagan", "Carter", "Ford"],
"schoolRegion": [["E", "AttributeError"], ["E", "AttributeError"], ["E", "AttributeError"],
["E", "AttributeError"], ["E", "AttributeError"], ["E", "AttributeError"], ["E", "AttributeError"]],
"schoolShort": [["E", "AttributeError"], ["E", "AttributeError"], ["E", "AttributeError"],
["E", "AttributeError"], ["E", "AttributeError"], ["E", "AttributeError"], ["E", "AttributeError"]]
}],
["AddTable", "Students", [
{ "isFormula": false, "formula": "", "type": "Text", "id": "firstName"},
{ "isFormula": false, "formula": "", "type": "Text", "id": "lastName"},
{ "isFormula": true,
"formula": "rec.firstName + ' ' + rec.lastName", "type": "Any",
"id": "fullName"},
{ "isFormula": true, "formula": "len(rec.fullName)", "type": "Any", "id": "fullNameLen"},
{ "isFormula": true,
"formula": "rec.school.name.split(' ')[0]", "type": "Any",
"id": "schoolShort"},
{ "isFormula": true, "formula": "addr = $school.address\naddr.state if addr.country == 'US' else addr.region", "type": "Any" ,
"id": "schoolRegion"}
]]
]
}
}],
["CHECK_OUTPUT", {
"Address": [
["id", "city", "state", "country", "@region"],
[2, "Eureka", "IL", "US", "North America"],
[3, "Annapolis", "MD", "US", "North America"],
[4, "New Haven", "CT", "US", "North America"],
[7, "New York", "NY", "US", "North America"],
[10, "Oxford", "England", "UK", "Europe"]]
}]
]
}, {
//----------------------------------------------------------------------
"TEST_CASE": "rename_table",
//----------------------------------------------------------------------
"BODY": [
["LOAD_SAMPLE", "basic"],
["APPLY", {
// Check that tables can be renamed.
"USER_ACTIONS": [
["RenameTable", "Students", "People"],
["RenameTable", "Schools", "School"]
],
"ACTIONS": {
"stored": [
["RenameTable", "Students", "People"],
["UpdateRecord", "_grist_Tables", 1, {"tableId": "People"}],
["ModifyColumn", "People", "school", {"type": "Int"}],
["RenameTable", "Schools", "School"],
["UpdateRecord", "_grist_Tables", 2, {"tableId": "School"}],
["ModifyColumn", "People", "school", {"type": "Ref:School"}],
["UpdateRecord", "_grist_Tables_column", 5, {"type": "Ref:School"}]
],
"undo": [
["RenameTable", "People", "Students"],
["UpdateRecord", "_grist_Tables", 1, {"tableId": "Students"}],
["ModifyColumn", "People", "school", {"type": "Ref:Schools"}],
["RenameTable", "School", "Schools"],
["UpdateRecord", "_grist_Tables", 2, {"tableId": "Schools"}],
["ModifyColumn", "People", "school", {"type": "Int"}],
["UpdateRecord", "_grist_Tables_column", 5, {"type": "Ref:Schools"}]
]
},
"CHECK_CALL_COUNTS" : {
"People" : { "fullName" : 7, "schoolRegion" : 7, "schoolShort" : 7, "fullNameLen" : 7 }
}
}],
["APPLY", {
// Check that tables can be renamed to a differently-cased name which SQLite considers
// equivalent (see RenameTable in DocStorage.js)
"USER_ACTIONS": [
["RenameTable", "People", "PEOPLE"],
["RenameTable", "PEOPLE", "People"]
],
"ACTIONS": {
"stored": [
["RenameTable", "People", "PEOPLE"],
["UpdateRecord", "_grist_Tables", 1, {"tableId": "PEOPLE"}],
["RenameTable", "PEOPLE", "People"],
["UpdateRecord", "_grist_Tables", 1, {"tableId": "People"}]
],
"undo": [
["RenameTable", "PEOPLE", "People"],
["UpdateRecord", "_grist_Tables", 1, {"tableId": "People"}],
["RenameTable", "People", "PEOPLE"],
["UpdateRecord", "_grist_Tables", 1, {"tableId": "PEOPLE"}]
]
}
}],
["APPLY", {
// Check that references to renamed tables continue to work.
"USER_ACTION": ["RemoveRecord", "School", 8],
"ACTIONS": {
"stored": [
["RemoveRecord", "School", 8],
["BulkUpdateRecord", "People", [2, 4], {"school": [0, 0]}],
["BulkUpdateRecord", "People", [2, 4], {"schoolRegion": [null, null]}],
["BulkUpdateRecord", "People", [2, 4], {"schoolShort": ["", ""]}]
],
"undo": [
["AddRecord", "School", 8, {"name": "Yale University", "address": 4}],
["BulkUpdateRecord", "People", [2, 4], {"school": [8, 8]}],
["BulkUpdateRecord", "People", [2, 4], {"schoolRegion": ["CT", "CT"]}],
["BulkUpdateRecord", "People", [2, 4], {"schoolShort": ["Yale", "Yale"]}]
]
},
"CHECK_CALL_COUNTS" : {
"People" : { "schoolRegion" : 2, "schoolShort" : 2 }
}
}],
["CHECK_OUTPUT", {
"People": [
["id","firstName","lastName","school","@fullName","@fullNameLen","@schoolShort",
"@schoolRegion"],
[1, "Barack", "Obama", 2, "Barack Obama", 12, "Columbia", "NY"],
[2, "George W", "Bush", 0, "George W Bush",13, "", null],
[3, "Bill", "Clinton", 6, "Bill Clinton", 12, "Oxford", "Europe"],
[4, "George H", "Bush", 0, "George H Bush",13, "", null],
[5, "Ronald", "Reagan", 1, "Ronald Reagan",13, "Eureka", "IL"],
[6, "Jimmy", "Carter", 5, "Jimmy Carter", 12, "U.S.", "MD"],
[8, "Gerald", "Ford", 7, "Gerald Ford", 11, "Yale", "CT"]],
"School": [
["id", "name", "address"],
[1, "Eureka College", 2],
[2, "Columbia University", 7],
[5, "U.S. Naval Academy", 3],
[6, "Oxford University", 10],
[7, "Yale Law School", 4]],
"Address": [
["id", "city", "state", "country", "@region"],
[2, "Eureka", "IL", "US", "North America"],
[3, "Annapolis", "MD", "US", "North America"],
[4, "New Haven", "CT", "US", "North America"],
[7, "New York", "NY", "US", "North America"],
[10, "Oxford", "England", "UK", "Europe"]]
}]
]
}, {
//----------------------------------------------------------------------
"TEST_CASE": "user_rename_table",
//----------------------------------------------------------------------
"BODY": [
["LOAD_SAMPLE", "basic"],
["APPLY", {
// Check that tables can be renamed.
"USER_ACTIONS": [
["UpdateRecord", "_grist_Tables", 1, {"tableId": "People"}],
["UpdateRecord", "_grist_Tables", 2, {"tableId": "School"}]
],
"ACTIONS": {
"stored": [
["RenameTable", "Students", "People"],
["UpdateRecord", "_grist_Tables", 1, {"tableId": "People"}],
["ModifyColumn", "People", "school", {"type": "Int"}],
["RenameTable", "Schools", "School"],
["UpdateRecord", "_grist_Tables", 2, {"tableId": "School"}],
["ModifyColumn", "People", "school", {"type": "Ref:School"}],
["UpdateRecord", "_grist_Tables_column", 5, {"type": "Ref:School"}]
],
"undo": [
["RenameTable", "People", "Students"],
["UpdateRecord", "_grist_Tables", 1, {"tableId": "Students"}],
["ModifyColumn", "People", "school", {"type": "Ref:Schools"}],
["RenameTable", "School", "Schools"],
["UpdateRecord", "_grist_Tables", 2, {"tableId": "Schools"}],
["ModifyColumn", "People", "school", {"type": "Int"}],
["UpdateRecord", "_grist_Tables_column", 5, {"type": "Ref:Schools"}]
]
},
"CHECK_CALL_COUNTS" : {
"People" : { "fullName" : 7, "schoolRegion" : 7, "schoolShort" : 7, "fullNameLen" : 7 }
}
}],
["APPLY", {
// Check that references to renamed tables continue to work.
"USER_ACTION": ["RemoveRecord", "School", 8],
"ACTIONS": {
"stored": [
["RemoveRecord", "School", 8],
["BulkUpdateRecord", "People", [2, 4], {"school": [0, 0]}],
["BulkUpdateRecord", "People", [2, 4], {"schoolRegion": [null, null]}],
["BulkUpdateRecord", "People", [2, 4], {"schoolShort": ["", ""]}]
],
"undo": [
["AddRecord", "School", 8, {"name": "Yale University", "address": 4}],
["BulkUpdateRecord", "People", [2, 4], {"school": [8, 8]}],
["BulkUpdateRecord", "People", [2, 4], {"schoolRegion": ["CT", "CT"]}],
["BulkUpdateRecord", "People", [2, 4], {"schoolShort": ["Yale", "Yale"]}]
]
},
"CHECK_CALL_COUNTS" : {
"People" : { "schoolRegion" : 2, "schoolShort" : 2 }
}
}],
["CHECK_OUTPUT", {
"People": [
["id","firstName","lastName","school","@fullName","@fullNameLen","@schoolShort",
"@schoolRegion"],
[1, "Barack", "Obama", 2, "Barack Obama", 12, "Columbia", "NY"],
[2, "George W", "Bush", 0, "George W Bush",13, "", null],
[3, "Bill", "Clinton", 6, "Bill Clinton", 12, "Oxford", "Europe"],
[4, "George H", "Bush", 0, "George H Bush",13, "", null],
[5, "Ronald", "Reagan", 1, "Ronald Reagan",13, "Eureka", "IL"],
[6, "Jimmy", "Carter", 5, "Jimmy Carter", 12, "U.S.", "MD"],
[8, "Gerald", "Ford", 7, "Gerald Ford", 11, "Yale", "CT"]],
"School": [
["id", "name", "address"],
[1, "Eureka College", 2],
[2, "Columbia University", 7],
[5, "U.S. Naval Academy", 3],
[6, "Oxford University", 10],
[7, "Yale Law School", 4]],
"Address": [
["id", "city", "state", "country", "@region"],
[2, "Eureka", "IL", "US", "North America"],
[3, "Annapolis", "MD", "US", "North America"],
[4, "New Haven", "CT", "US", "North America"],
[7, "New York", "NY", "US", "North America"],
[10, "Oxford", "England", "UK", "Europe"]]
}]
]
}, {
//------------------------------------------------------------------------
"TEST_CASE" : "eval_code",
//------------------------------------------------------------------------
"BODY": [
["LOAD_SAMPLE", "basic"],
["APPLY", {
"USER_ACTIONS": [
// Basic tests
["EvalCode", "print 'cats'", null],
["EvalCode", "2 * 3 - 1 / 7 + 4", null],
// Exception
["EvalCode", "raise Exception('everything broke')", null],
// Incomplete structure
["EvalCode", "for x in range(1, 100):", null],
// Re-evaluation
["EvalCode", "print 'cats'", 1],
["EvalCode", "print 'dogs'", 1],
// Function definition
["EvalCode", "def foo(x):\n\treturn x * 10\n", null],
["EvalCode", "foo(10)", null]
],
"ACTIONS" : {
"stored" : [
["AddRecord", "_grist_REPL_Hist", 1,
{"code": "print 'cats'", "errorText": "", "outputText": "cats\n"}],
["AddRecord", "_grist_REPL_Hist", 2,
{"code": "2 * 3 - 1 / 7 + 4", "errorText": "", "outputText": "10\n"}],
["AddRecord", "_grist_REPL_Hist", 3,
{"code": "raise Exception('everything broke')", "errorText": "Traceback (most recent call last):\n File \"<input>\", line 1, in <module>\nException: everything broke\n", "outputText": ""}],
["UpdateRecord", "_grist_REPL_Hist", 1,
{"code": "print 'cats'", "errorText": "", "outputText": "cats\n"}],
["UpdateRecord", "_grist_REPL_Hist", 1,
{"code": "print 'dogs'", "errorText": "", "outputText": "dogs\n"}],
["AddRecord", "_grist_REPL_Hist", 4,
{"code": "def foo(x):\n\treturn x * 10\n", "errorText": "", "outputText": ""}],
["AddRecord", "_grist_REPL_Hist", 5,
{"code": "foo(10)", "errorText": "", "outputText": "100\n"}]
],
"undo" : [
["RemoveRecord", "_grist_REPL_Hist", 1],
["RemoveRecord", "_grist_REPL_Hist", 2],
["RemoveRecord", "_grist_REPL_Hist", 3],
["UpdateRecord", "_grist_REPL_Hist", 1,
{"code": "print 'cats'", "errorText": "", "outputText": "cats\n"}],
["UpdateRecord", "_grist_REPL_Hist", 1,
{"code": "print 'cats'", "errorText": "", "outputText": "cats\n"}],
["RemoveRecord", "_grist_REPL_Hist", 4],
["RemoveRecord", "_grist_REPL_Hist", 5]
],
"retValue" : [true,true,true,false,true,true,true,true]
}
}],
["APPLY", {
"USER_ACTIONS": [
// Access to usercode before and after re-generation
["EvalCode", "list(Students.all.firstName)", null],
["UpdateRecord", "Students", 1, {"firstName": "2e6"}],
["ModifyColumn", "Students", "firstName", { "type" : "Numeric" }],
["EvalCode", "list(Students.all.firstName)", 6],
// Make sure that other tables are still usable as well after a schema change.
["EvalCode", "len(Schools.all)", 6]
],
"ACTIONS": {
"stored": [
["AddRecord", "_grist_REPL_Hist", 6,
{"code": "list(Students.all.firstName)", "errorText": "", "outputText": "['Barack', 'George W', 'Bill', 'George H', 'Ronald', 'Jimmy', 'Gerald']\n"}],
["UpdateRecord", "Students", 1, {"firstName": "2e6"}],
["ModifyColumn", "Students", "firstName", {"type": "Numeric"}],
["UpdateRecord", "Students", 1, {"firstName": 2e6}],
["UpdateRecord", "_grist_Tables_column", 1, {"type": "Numeric"}],
["UpdateRecord", "_grist_REPL_Hist", 6, {"code": "list(Students.all.firstName)",
"errorText": "",
"outputText": "[2000000.0, AltText('George W'), AltText('Bill'), AltText('George H'), AltText('Ronald'), AltText('Jimmy'), AltText('Gerald')]\n"}],
["UpdateRecord", "_grist_REPL_Hist", 6,
{"code": "len(Schools.all)", "errorText": "", "outputText": "6\n"}],
["BulkUpdateRecord", "Students", [1, 2, 3, 4, 5, 6, 8], {
"fullName": [["E", "TypeError"], ["E","TypeError"], ["E","TypeError"],
["E","TypeError"], ["E","TypeError"], ["E","TypeError"], ["E","TypeError"]]
}],
["BulkUpdateRecord", "Students", [1, 2, 3, 4, 5, 6, 8], {
"fullNameLen": [["E","TypeError"], ["E","TypeError"], ["E","TypeError"],
["E","TypeError"], ["E","TypeError"], ["E","TypeError"], ["E","TypeError"]]
}]
],
"undo": [
["RemoveRecord", "_grist_REPL_Hist", 6],
["UpdateRecord", "Students", 1, {"firstName": "Barack"}],
["UpdateRecord", "Students", 1, {"firstName": "2e6"}],
["ModifyColumn", "Students", "firstName", {"type": "Text"}],
["UpdateRecord", "_grist_Tables_column", 1, {"type": "Text"}],
["UpdateRecord", "_grist_REPL_Hist", 6, {"code": "list(Students.all.firstName)",
"errorText": "", "outputText": "['Barack', 'George W', 'Bill', 'George H', 'Ronald', 'Jimmy', 'Gerald']\n"}],
["UpdateRecord", "_grist_REPL_Hist", 6, {"code": "list(Students.all.firstName)",
"errorText": "",
"outputText": "[2000000.0, AltText('George W'), AltText('Bill'), AltText('George H'), AltText('Ronald'), AltText('Jimmy'), AltText('Gerald')]\n"}],
["BulkUpdateRecord", "Students", [1, 2, 3, 4, 5, 6, 8],
{"fullName": ["Barack Obama", "George W Bush", "Bill Clinton", "George H Bush", "Ronald Reagan", "Jimmy Carter", "Gerald Ford"]}],
["BulkUpdateRecord", "Students", [1, 2, 3, 4, 5, 6, 8],
{"fullNameLen": [12, 13, 12, 13, 13, 12, 11]}]
],
"retValue": [true,null,null,true,true]
}
}],
["APPLY", {
"USER_ACTIONS": [
// Syntax Error
["EvalCode", "*!@&$fjjj112#(8!", null],
// Other continuations
["EvalCode", "map(filter, ", null],
["EvalCode", "[1,2,3,", null],
// sys.exit
["EvalCode", "import sys", null],
["EvalCode", "sys.exit(0)", null],
// User reassignment of sys.stdout/sys.stderr
["EvalCode", "sys.stdout = None", null],
["EvalCode", "delattr(sys.stderr, 'close')", null],
["EvalCode", "setattr(sys.stdout, 'getvalue', lambda : 2)", null],
["EvalCode", "def foo():\n global stdout\n exec 'stdout = 2'\n", null],
["EvalCode", "setattr(sys.stderr, 'close', foo)", null]
],
"ACTIONS": {
"stored": [
["AddRecord", "_grist_REPL_Hist", 7,
{"code": "*!@&$fjjj112#(8!", "errorText": " File \"<input>\", line 1\n *!@&$fjjj112#(8!\n ^\nSyntaxError: invalid syntax\n", "outputText": ""}],
["AddRecord", "_grist_REPL_Hist", 8,
{"code": "import sys", "errorText": "", "outputText": ""}],
["AddRecord", "_grist_REPL_Hist", 9,
{"code": "sys.exit(0)", "errorText": "Traceback (most recent call last):\n File \"<input>\", line 1, in <module>\nSystemExit: 0\n", "outputText": ""}],
["AddRecord", "_grist_REPL_Hist", 10,
{"code": "sys.stdout = None", "errorText": "", "outputText": ""}],
["AddRecord", "_grist_REPL_Hist", 11,
{"code": "delattr(sys.stderr, 'close')", "errorText": "Traceback (most recent call last):\n File \"<input>\", line 1, in <module>\nAttributeError: StringIO instance has no attribute 'close'\n", "outputText": ""}],
["AddRecord", "_grist_REPL_Hist", 12,
{"code": "setattr(sys.stdout, 'getvalue', lambda : 2)", "errorText": "", "outputText": 2}],
["AddRecord", "_grist_REPL_Hist", 13,
{"code": "def foo():\n global stdout\n exec 'stdout = 2'\n", "errorText": "", "outputText": ""}],
["AddRecord", "_grist_REPL_Hist", 14,
{"code": "setattr(sys.stderr, 'close', foo)", "errorText": "", "outputText": ""}]
],
"undo": [
["RemoveRecord", "_grist_REPL_Hist", 7],
["RemoveRecord", "_grist_REPL_Hist", 8],
["RemoveRecord", "_grist_REPL_Hist", 9],
["RemoveRecord", "_grist_REPL_Hist", 10],
["RemoveRecord", "_grist_REPL_Hist", 11],
["RemoveRecord", "_grist_REPL_Hist", 12],
["RemoveRecord", "_grist_REPL_Hist", 13],
["RemoveRecord", "_grist_REPL_Hist", 14]
],
"retValue" : [true,false,false,true,true,true,true,true,true,true ]
}
}]
]
}, {
//------------------------------------------------------------------------
"TEST_CASE" : "reserved_keywords",
//------------------------------------------------------------------------
"BODY": [
["LOAD_SAMPLE", "simplest"],
["APPLY", {
"USER_ACTIONS": [
["AddColumn", "foo", "on", {"type": "Text", "isFormula": false}],
["AddColumn", "foo", "alter", {"type": "Text", "isFormula": false}],
["AddColumn", "foo", "create", {"type": "Text", "isFormula": false}],
["AddColumn", "foo", "drop", {"type": "Text", "isFormula": false}],
["AddColumn", "foo", "transaction", {"type": "Text", "isFormula": false}],
["AddColumn", "foo", "table", {"type": "Text", "isFormula": false}]
],
"ACTIONS": {
"stored": [
["AddColumn", "foo", "on", {"type": "Text", "isFormula": false, "formula": ""}],
["AddRecord", "_grist_Tables_column", 2, { "colId": "on", "formula": "", "isFormula":
false, "label": "on", "parentId": 1, "parentPos": 2.0, "type": "Text", "widgetOptions":
""}],
["AddColumn", "foo", "alter", {"type": "Text", "isFormula": false, "formula": ""}],
["AddRecord", "_grist_Tables_column", 3, { "colId": "alter", "formula": "", "isFormula":
false, "label": "alter", "parentId": 1, "parentPos": 3.0, "type": "Text", "widgetOptions":
""}],
["AddColumn", "foo", "create", {"type": "Text", "isFormula": false, "formula": ""}],
["AddRecord", "_grist_Tables_column", 4, { "colId": "create", "formula": "", "isFormula":
false, "label": "create", "parentId": 1, "parentPos": 4.0, "type": "Text", "widgetOptions":
""}],
["AddColumn", "foo", "drop", {"type": "Text", "isFormula": false, "formula": ""}],
["AddRecord", "_grist_Tables_column", 5, { "colId": "drop", "formula": "", "isFormula":
false, "label": "drop", "parentId": 1, "parentPos": 5.0, "type": "Text", "widgetOptions":
""}],
["AddColumn", "foo", "transaction", {"type": "Text", "isFormula": false, "formula": ""}],
["AddRecord", "_grist_Tables_column", 6, { "colId": "transaction", "formula": "", "isFormula":
false, "label": "transaction", "parentId": 1, "parentPos": 6.0, "type": "Text", "widgetOptions":
""}],
["AddColumn", "foo", "table", {"type": "Text", "isFormula": false, "formula": ""}],
["AddRecord", "_grist_Tables_column", 7, { "colId": "table", "formula": "", "isFormula":
false, "label": "table", "parentId": 1, "parentPos": 7.0, "type": "Text", "widgetOptions":
""}]
],
"undo": [
["RemoveColumn", "foo", "on"],
["RemoveRecord", "_grist_Tables_column", 2],
["RemoveColumn", "foo", "alter"],
["RemoveRecord", "_grist_Tables_column", 3],
["RemoveColumn", "foo", "create"],
["RemoveRecord", "_grist_Tables_column", 4],
["RemoveColumn", "foo", "drop"],
["RemoveRecord", "_grist_Tables_column", 5],
["RemoveColumn", "foo", "transaction"],
["RemoveRecord", "_grist_Tables_column", 6],
["RemoveColumn", "foo", "table"],
["RemoveRecord", "_grist_Tables_column", 7]
]
}
}],
["CHECK_OUTPUT", {
"USE_SAMPLE": "simplest",
"foo": [
["id", "bar", "on", "alter", "create", "drop", "transaction", "table"],
[1, "apple", "", "", "", "", "", ""]
]
}],
["APPLY", {
"USER_ACTIONS": [
["RenameColumn", "foo", "on", "select"],
["RenameColumn", "foo", "alter", "on"],
["RenameColumn", "foo", "create", "alter"],
["RenameColumn", "foo", "drop", "create"],
["RenameColumn", "foo", "transaction", "drop"],
["RenameColumn", "foo", "table", "transaction"]
],
"ACTIONS": {
"stored": [
["RenameColumn", "foo", "on", "select"],
["UpdateRecord", "_grist_Tables_column", 2, {"colId": "select"}],
["RenameColumn", "foo", "alter", "on"],
["UpdateRecord", "_grist_Tables_column", 3, {"colId": "on"}],
["RenameColumn", "foo", "create", "alter"],
["UpdateRecord", "_grist_Tables_column", 4, {"colId": "alter"}],
["RenameColumn", "foo", "drop", "create"],
["UpdateRecord", "_grist_Tables_column", 5, {"colId": "create"}],
["RenameColumn", "foo", "transaction", "drop"],
["UpdateRecord", "_grist_Tables_column", 6, {"colId": "drop"}],
["RenameColumn", "foo", "table", "transaction"],
["UpdateRecord", "_grist_Tables_column", 7, {"colId": "transaction"}]
],
"undo": [
["RenameColumn", "foo", "select", "on"],
["UpdateRecord", "_grist_Tables_column", 2, {"colId": "on"}],
["RenameColumn", "foo", "on", "alter"],
["UpdateRecord", "_grist_Tables_column", 3, {"colId": "alter"}],
["RenameColumn", "foo", "alter", "create"],
["UpdateRecord", "_grist_Tables_column", 4, {"colId": "create"}],
["RenameColumn", "foo", "create", "drop"],
["UpdateRecord", "_grist_Tables_column", 5, {"colId": "drop"}],
["RenameColumn", "foo", "drop", "transaction"],
["UpdateRecord", "_grist_Tables_column", 6, {"colId": "transaction"}],
["RenameColumn", "foo", "transaction", "table"],
["UpdateRecord", "_grist_Tables_column", 7, {"colId": "table"}]
]
}
}],
["CHECK_OUTPUT", {
"USE_SAMPLE": "simplest",
"foo": [
["id", "bar", "select", "on", "alter", "create", "drop", "transaction"],
[1, "apple", "", "", "", "", "", ""]
]
}]
]
}]