diff .cms/lib/codemirror/test/sql-hint-test.js @ 0:78edf6b517a0 draft

24.10
author Coffee CMS <info@coffee-cms.ru>
date Fri, 11 Oct 2024 22:40:23 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.cms/lib/codemirror/test/sql-hint-test.js	Fri Oct 11 22:40:23 2024 +0000
@@ -0,0 +1,301 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/5/LICENSE
+
+(function() {
+  var Pos = CodeMirror.Pos;
+
+  var simpleTables = {
+    "users": ["name", "score", "birthDate"],
+    "xcountries": ["name", "population", "size"]
+  };
+
+  var schemaTables = {
+    "schema.users": ["name", "score", "birthDate"],
+    "schema.countries": ["name", "population", "size"]
+  };
+
+  var displayTextTables = [{
+    text: "mytable",
+    displayText: "mytable | The main table",
+    columns: [{text: "id", displayText: "id | Unique ID"},
+              {text: "name", displayText: "name | The name"}]
+  }];
+
+  var displayTextTablesWithDefault = [
+    {
+      text: "Api__TokenAliases",
+      columns: [
+        {
+          text: "token",
+          displayText: "token | varchar(255) | Primary",
+          columnName: "token",
+          columnHint: "varchar(255) | Primary"
+        },
+        {
+          text: "alias",
+          displayText: "alias | varchar(255) | Primary",
+          columnName: "alias",
+          columnHint: "varchar(255) | Primary"
+        }
+      ]
+    },
+    {
+      text: "mytable",
+      columns: [
+        { text: "id", displayText: "id | Unique ID" },
+        { text: "name", displayText: "name | The name" }
+      ]
+    }
+  ];
+
+  namespace = "sql-hint_";
+
+  function test(name, spec) {
+    testCM(name, function(cm) {
+      cm.setValue(spec.value);
+      cm.setCursor(spec.cursor);
+      var completion = CodeMirror.hint.sql(cm, {
+        tables: spec.tables,
+        defaultTable: spec.defaultTable,
+        disableKeywords: spec.disableKeywords
+      });
+      if (!deepCompare(completion.list, spec.list))
+        throw new Failure("Wrong completion results " + JSON.stringify(completion.list) + " vs " + JSON.stringify(spec.list));
+      eqCharPos(completion.from, spec.from);
+      eqCharPos(completion.to, spec.to);
+    }, {
+      value: spec.value,
+      mode: spec.mode || "text/x-mysql"
+    });
+  }
+
+  test("keywords", {
+    value: "SEL",
+    cursor: Pos(0, 3),
+    list: [{"text":"SELECT","className":"CodeMirror-hint-keyword"}],
+    from: Pos(0, 0),
+    to: Pos(0, 3)
+  });
+
+  test("keywords_disabled", {
+    value: "SEL",
+    cursor: Pos(0, 3),
+    disableKeywords: true,
+    list: [],
+    from: Pos(0, 0),
+    to: Pos(0, 3)
+  });
+
+  test("from", {
+    value: "SELECT * fr",
+    cursor: Pos(0, 11),
+    list: [{"text":"FROM","className":"CodeMirror-hint-keyword"}],
+    from: Pos(0, 9),
+    to: Pos(0, 11)
+  });
+
+  test("table", {
+    value: "SELECT xc",
+    cursor: Pos(0, 9),
+    tables: simpleTables,
+    list: [{"text":"xcountries","className":"CodeMirror-hint-table"}],
+    from: Pos(0, 7),
+    to: Pos(0, 9)
+  });
+
+  test("columns", {
+    value: "SELECT users.",
+    cursor: Pos(0, 13),
+    tables: simpleTables,
+    list: ["users.name", "users.score", "users.birthDate"],
+    from: Pos(0, 7),
+    to: Pos(0, 13)
+  });
+
+  test("singlecolumn", {
+    value: "SELECT users.na",
+    cursor: Pos(0, 15),
+    tables: simpleTables,
+    list: ["users.name"],
+    from: Pos(0, 7),
+    to: Pos(0, 15)
+  });
+
+  test("quoted", {
+    value: "SELECT `users`.`na",
+    cursor: Pos(0, 18),
+    tables: simpleTables,
+    list: ["`users`.`name`"],
+    from: Pos(0, 7),
+    to: Pos(0, 18)
+  });
+
+  test("doublequoted", {
+    value: "SELECT \"users\".\"na",
+    cursor: Pos(0, 18),
+    tables: simpleTables,
+    list: ["\"users\".\"name\""],
+    from: Pos(0, 7),
+    to: Pos(0, 18),
+    mode: "text/x-sqlite"
+  });
+
+  test("quotedcolumn", {
+    value: "SELECT users.`na",
+    cursor: Pos(0, 16),
+    tables: simpleTables,
+    list: ["`users`.`name`"],
+    from: Pos(0, 7),
+    to: Pos(0, 16)
+  });
+
+  test("doublequotedcolumn", {
+    value: "SELECT users.\"na",
+    cursor: Pos(0, 16),
+    tables: simpleTables,
+    list: ["\"users\".\"name\""],
+    from: Pos(0, 7),
+    to: Pos(0, 16),
+    mode: "text/x-sqlite"
+  });
+
+  test("schema", {
+    value: "SELECT schem",
+    cursor: Pos(0, 12),
+    tables: schemaTables,
+    list: [{"text":"schema.users","className":"CodeMirror-hint-table"},
+        {"text":"schema.countries","className":"CodeMirror-hint-table"},
+        {"text":"SCHEMA","className":"CodeMirror-hint-keyword"},
+        {"text":"SCHEMA_NAME","className":"CodeMirror-hint-keyword"},
+        {"text":"SCHEMAS","className":"CodeMirror-hint-keyword"}],
+    from: Pos(0, 7),
+    to: Pos(0, 12)
+  });
+
+  test("schemaquoted", {
+    value: "SELECT `sch",
+    cursor: Pos(0, 11),
+    tables: schemaTables,
+    list: ["`schema`.`users`", "`schema`.`countries`"],
+    from: Pos(0, 7),
+    to: Pos(0, 11)
+  });
+
+  test("schemadoublequoted", {
+    value: "SELECT \"sch",
+    cursor: Pos(0, 11),
+    tables: schemaTables,
+    list: ["\"schema\".\"users\"", "\"schema\".\"countries\""],
+    from: Pos(0, 7),
+    to: Pos(0, 11),
+    mode: "text/x-sqlite"
+  });
+
+  test("schemacolumn", {
+    value: "SELECT schema.users.",
+    cursor: Pos(0, 20),
+    tables: schemaTables,
+    list: ["schema.users.name",
+           "schema.users.score",
+           "schema.users.birthDate"],
+    from: Pos(0, 7),
+    to: Pos(0, 20)
+  });
+
+  test("schemacolumnquoted", {
+    value: "SELECT `schema`.`users`.",
+    cursor: Pos(0, 24),
+    tables: schemaTables,
+    list: ["`schema`.`users`.`name`",
+           "`schema`.`users`.`score`",
+           "`schema`.`users`.`birthDate`"],
+    from: Pos(0, 7),
+    to: Pos(0, 24)
+  });
+
+  test("schemacolumndoublequoted", {
+    value: "SELECT \"schema\".\"users\".",
+    cursor: Pos(0, 24),
+    tables: schemaTables,
+    list: ["\"schema\".\"users\".\"name\"",
+           "\"schema\".\"users\".\"score\"",
+           "\"schema\".\"users\".\"birthDate\""],
+    from: Pos(0, 7),
+    to: Pos(0, 24),
+    mode: "text/x-sqlite"
+  });
+
+  test("displayText_default_table", {
+    value: "SELECT a",
+    cursor: Pos(0, 8),
+    disableKeywords: true,
+    defaultTable: "Api__TokenAliases",
+    tables: displayTextTablesWithDefault,
+    list: [
+      {
+        text: "alias",
+        displayText: "alias | varchar(255) | Primary",
+        columnName: "alias",
+        columnHint: "varchar(255) | Primary",
+        className: "CodeMirror-hint-table CodeMirror-hint-default-table"
+      },
+      { text: "Api__TokenAliases", className: "CodeMirror-hint-table" }
+    ],
+    from: Pos(0, 7),
+    to: Pos(0, 8)
+  });
+
+  test("displayText_table", {
+    value: "SELECT myt",
+    cursor: Pos(0, 10),
+    tables: displayTextTables,
+    list: [{text: "mytable", displayText: "mytable | The main table", "className":"CodeMirror-hint-table"}],
+    from: Pos(0, 7),
+    to: Pos(0, 10)
+  });
+
+  test("displayText_column", {
+    value: "SELECT mytable.",
+    cursor: Pos(0, 15),
+    tables: displayTextTables,
+    list: [{text: "mytable.id", displayText: "id | Unique ID"},
+           {text: "mytable.name", displayText: "name | The name"}],
+    from: Pos(0, 7),
+    to: Pos(0, 15)
+  });
+
+  test("alias_complete", {
+    value: "SELECT t. FROM users t",
+    cursor: Pos(0, 9),
+    tables: simpleTables,
+    list: ["t.name", "t.score", "t.birthDate"],
+    from: Pos(0, 7),
+    to: Pos(0, 9)
+  });
+
+  test("alias_complete_with_displayText", {
+    value: "SELECT t. FROM mytable t",
+    cursor: Pos(0, 9),
+    tables: displayTextTables,
+    list: [{text: "t.id", displayText: "id | Unique ID"},
+           {text: "t.name", displayText: "name | The name"}],
+    from: Pos(0, 7),
+    to: Pos(0, 9)
+  })
+
+  function deepCompare(a, b) {
+    if (a === b) return true
+    if (!(a && typeof a == "object") ||
+        !(b && typeof b == "object")) return false
+    var array = Array.isArray(a)
+    if (Array.isArray(b) != array) return false
+    if (array) {
+      if (a.length != b.length) return false
+      for (var i = 0; i < a.length; i++) if (!deepCompare(a[i], b[i])) return false
+    } else {
+      for (var p in a) if (!(p in b) || !deepCompare(a[p], b[p])) return false
+      for (var p in b) if (!(p in a)) return false
+    }
+    return true
+  }
+})();