{ "setup": [
    { "name"  : "prepare the test domain",
      "params": { "Action": "CreateDomain",
                  "DomainName": "companies" } }
  ],
  "teardown": [
    { "name"  : "delete the test domain",
      "params": { "Action": "DeleteDomain",
                  "DomainName": "companies" } }
  ],
  "requests": [

  [
    { "name"  : "text, without options",
      "params": { "Action": "DefineIndexField",
                  "DomainName": "companies",
                  "IndexField.IndexFieldName": "name",
                  "IndexField.IndexFieldType": "text" } },
    { "name"  : "text, redefine (update options) without type",
      "params": { "Action": "DefineIndexField",
                  "DomainName": "companies",
                  "IndexField.IndexFieldName": "name",
                  "IndexField.TextOptions.ResultEnabled": "true" } }
  ],

  { "name"  : "text, with result enabled",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "name_with_result_enabled",
                "IndexField.IndexFieldType": "text",
                "IndexField.TextOptions.ResultEnabled": "true" } },

  { "name"  : "text, with facet enabled",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "name_with_facet_enabled",
                "IndexField.IndexFieldType": "text",
                "IndexField.TextOptions.ResultEnabled": "true" } },

  { "name"  : "text, with conflicting options",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "name_with_conflicting_options",
                "IndexField.IndexFieldType": "text",
                "IndexField.TextOptions.FacetEnabled": "true",
                "IndexField.TextOptions.ResultEnabled": "true" } },

  [
    { "name"  : "conflicting options in multiple steps: setup",
      "params": { "Action": "DefineIndexField",
                  "DomainName": "companies",
                  "IndexField.IndexFieldName": "name_with_conflicting_options",
                  "IndexField.IndexFieldType": "text",
                  "IndexField.TextOptions.FacetEnabled": "true" } },
    { "name"  : "set conflicting option",
      "params": { "Action": "DefineIndexField",
                  "DomainName": "companies",
                  "IndexField.IndexFieldName": "name_with_conflicting_options",
                  "IndexField.IndexFieldType": "text",
                  "IndexField.TextOptions.ResultEnabled": "true" } }
  ],

  [
    { "name"  : "uint, without options",
      "params": { "Action": "DefineIndexField",
                  "DomainName": "companies",
                  "IndexField.IndexFieldName": "age",
                  "IndexField.IndexFieldType": "uint" } },
    { "name"  : "uint, redefine without type",
      "params": { "Action": "DefineIndexField",
                  "DomainName": "companies",
                  "IndexField.IndexFieldName": "age" } }
  ],

  [
    { "name"  : "literal, without options",
      "params": { "Action": "DefineIndexField",
                  "DomainName": "companies",
                  "IndexField.IndexFieldName": "product",
                  "IndexField.IndexFieldType": "literal" } },
    { "name"  : "literal, redefine (update options, without type)",
      "params": { "Action": "DefineIndexField",
                  "DomainName": "companies",
                  "IndexField.IndexFieldName": "product",
                  "IndexField.LiteralOptions.SearchEnabled": "true" } }
  ],

  { "name"  : "literal, with search enabled",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "product_with_search_enabled",
                "IndexField.IndexFieldType": "literal",
                "IndexField.LiteralOptions.SearchEnabled": "true" } },

  { "name"  : "literal, with facet enabled",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "product_with_facet_enabled",
                "IndexField.IndexFieldType": "literal",
                "IndexField.LiteralOptions.FacetEnabled": "true" } },

  { "name"  : "literal, with result enabled",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "product_with_result_enabled",
                "IndexField.IndexFieldType": "literal",
                "IndexField.LiteralOptions.ResultEnabled": "true" } },

  { "name"  : "literal, with search_and_result",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "product_with_search_and_result",
                "IndexField.IndexFieldType": "literal",
                "IndexField.LiteralOptions.SearchEnabled": "true",
                "IndexField.LiteralOptions.ResultEnabled": "true" } },

  { "name"  : "literal, with facet_and_result",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "product_with_facet_and_result",
                "IndexField.IndexFieldType": "literal",
                "IndexField.LiteralOptions.FacetEnabled": "true",
                "IndexField.LiteralOptions.ResultEnabled": "true" } },

  { "name"  : "literal, with search_and_facet",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "product_with_search_and_facet",
                "IndexField.IndexFieldType": "literal",
                "IndexField.LiteralOptions.SearchEnabled": "true",
                "IndexField.LiteralOptions.FacetEnabled": "true" } },

  [
    { "name"  : "setup: define temporary text field",
      "params": { "Action": "DefineIndexField",
                  "DomainName": "companies",
                  "IndexField.IndexFieldName": "name2",
                  "IndexField.IndexFieldType": "text" } },
    { "name"  : "update field type from text to literal",
      "params": { "Action": "DefineIndexField",
                  "DomainName": "companies",
                  "IndexField.IndexFieldName": "name2",
                  "IndexField.IndexFieldType": "literal" } }
  ],

  [
    { "name"  : "setup: define temporary literal field",
      "params": { "Action": "DefineIndexField",
                  "DomainName": "companies",
                  "IndexField.IndexFieldName": "product2",
                  "IndexField.IndexFieldType": "literal" } },
    { "name"  : "update field type from literal to text",
      "params": { "Action": "DefineIndexField",
                  "DomainName": "companies",
                  "IndexField.IndexFieldName": "product2",
                  "IndexField.IndexFieldType": "text" } }
  ],

  [
    { "name"  : "setup: define temporary text field",
      "params": { "Action": "DefineIndexField",
                  "DomainName": "companies",
                  "IndexField.IndexFieldName": "name3",
                  "IndexField.IndexFieldType": "text" } },
    { "name"  : "update field type from text to uint",
      "params": { "Action": "DefineIndexField",
                  "DomainName": "companies",
                  "IndexField.IndexFieldName": "name3",
                  "IndexField.IndexFieldType": "uint" } }
  ],

  [
    { "name"  : "setup: define temporary uint field",
      "params": { "Action": "DefineIndexField",
                  "DomainName": "companies",
                  "IndexField.IndexFieldName": "age2",
                  "IndexField.IndexFieldType": "uint" } },
    { "name"  : "update field type from uint to text",
      "params": { "Action": "DefineIndexField",
                  "DomainName": "companies",
                  "IndexField.IndexFieldName": "age2",
                  "IndexField.IndexFieldType": "text" } }
  ],

  [
    { "name"  : "setup: define temporary uint field",
      "params": { "Action": "DefineIndexField",
                  "DomainName": "companies",
                  "IndexField.IndexFieldName": "age3",
                  "IndexField.IndexFieldType": "uint" } },
    { "name"  : "update field type from uint to literal",
      "params": { "Action": "DefineIndexField",
                  "DomainName": "companies",
                  "IndexField.IndexFieldName": "age3",
                  "IndexField.IndexFieldType": "literal" } }
  ],

  { "name"  : "with too short (one letter) domain name",
    "params": { "Action": "DefineIndexField",
                "DomainName": "a",
                "IndexField.IndexFieldName": "never_exist",
                "IndexField.IndexFieldType": "text" } },

  { "name"  : "with too short (two letters) domain name",
    "params": { "Action": "DefineIndexField",
                "DomainName": "ab",
                "IndexField.IndexFieldName": "never_exist",
                "IndexField.IndexFieldType": "text" } },

  { "name"  : "with too long domain name",
    "params": { "Action": "DefineIndexField",
                "DomainName": "abcdefghijklmnopqrstuvwxyz0123456789",
                "IndexField.IndexFieldName": "never_exist",
                "IndexField.IndexFieldType": "text" } },

  { "name"  : "with domain name including invalid character",
    "params": { "Action": "DefineIndexField",
                "DomainName": "@_@",
                "IndexField.IndexFieldName": "never_exist",
                "IndexField.IndexFieldType": "text" } },

  { "name"  : "with too long domain name including invalid character",
    "params": { "Action": "DefineIndexField",
                "DomainName": "@abcdefghijklmnopqrstuvwxyz0123456789",
                "IndexField.IndexFieldName": "never_exist",
                "IndexField.IndexFieldType": "text" } },

  { "name"  : "without domain name",
    "params": { "Action": "DefineIndexField",
                "DomainName": "",
                "IndexField.IndexFieldName": "never_exist",
                "IndexField.IndexFieldType": "text" } },

  { "name"  : "for not-existing domain",
    "params": { "Action": "DefineIndexField",
                "DomainName": "unknown",
                "IndexField.IndexFieldName": "never_exist",
                "IndexField.IndexFieldType": "text" } },


  { "name"  : "define without type",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "name_without_type" } },

  { "name"  : "define with invalid type",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "name_with_invalid_type",
                "IndexField.IndexFieldType": "invalid" } },

  { "name"  : "define with invalid name and invalid type",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "@name_with_invalid_character",
                "IndexField.IndexFieldType": "invalid" } },

  { "name"  : "update without type",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "name",
                "IndexField.TextOptions.FacetEnabled": "false" } },

  { "name"  : "update with invalid type",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "name",
                "IndexField.IndexFieldType": "invalid" } },


  { "name"  : "with unknown text option (same to behavior)",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "name",
                "IndexField.IndexFieldType": "text",
                "IndexField.TextOptions.SearchEnabled": "true" } },

  { "name"  : "with unknown text option (differnt to behavior)",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "name",
                "IndexField.IndexFieldType": "text",
                "IndexField.TextOptions.SearchEnabled": "false" } },

  { "name"  : "with unknown uint option (same to behavior)",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "age",
                "IndexField.IndexFieldType": "uint",
                "IndexField.UIntOptions.SearchEnabled": "true" } },

  { "name"  : "with unknown uint option (differnt to behavior)",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "age",
                "IndexField.IndexFieldType": "uint",
                "IndexField.UIntOptions.SearchEnabled": "false" } },

  { "name"  : "with mismatched type option (same to behavior)",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "name",
                "IndexField.IndexFieldType": "text",
                "IndexField.LiteralOptions.SearchEnabled": "true" } },

  { "name"  : "with mismatched type option (differnt to behavior)",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "name",
                "IndexField.IndexFieldType": "text",
                "IndexField.LiteralOptions.SearchEnabled": "false" } },

  { "name"  : "with completely unknown option",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "name",
                "IndexField.IndexFieldType": "text",
                "IndexField.LiteralOptions.UnknownOption": "true" } },


  { "name"  : "with too long field name",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789",
                "IndexField.IndexFieldType": "text" } },

  { "name"  : "with field name including invalid character",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "@_@",
                "IndexField.IndexFieldType": "text" } },

  { "name"  : "with too long field name including invalid character",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "@abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789",
                "IndexField.IndexFieldType": "text" } },

  { "name"  : "without field name",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "",
                "IndexField.IndexFieldType": "text" } },

  { "name"  : "with reserved field name 'body'",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "body",
                "IndexField.IndexFieldType": "text" } },
  { "name"  : "with reserved field name 'docid'",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "docid",
                "IndexField.IndexFieldType": "text" } },
  { "name"  : "with reserved field name 'text_relevance'",
    "params": { "Action": "DefineIndexField",
                "DomainName": "companies",
                "IndexField.IndexFieldName": "text_relevance",
                "IndexField.IndexFieldType": "text" } },

  { "name"  : "with too short domain name and too long field name",
    "params": { "Action": "DefineIndexField",
                "DomainName": "a",
                "IndexField.IndexFieldName": "abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789",
                "IndexField.IndexFieldType": "text" } },

  { "name"  : "with too long field name for not-existing domain",
    "params": { "Action": "DefineIndexField",
                "DomainName": "unknown",
                "IndexField.IndexFieldName": "abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789",
                "IndexField.IndexFieldType": "text" } }
] }
