public void testFromJson() throws IOException {
    String json =
        "{\n"
            + "  \"query_string\" : {\n"
            + "    \"query\" : \"this AND that OR thus\",\n"
            + "    \"default_field\" : \"content\",\n"
            + "    \"fields\" : [ ],\n"
            + "    \"use_dis_max\" : true,\n"
            + "    \"tie_breaker\" : 0.0,\n"
            + "    \"default_operator\" : \"or\",\n"
            + "    \"auto_generated_phrase_queries\" : false,\n"
            + "    \"max_determined_states\" : 10000,\n"
            + "    \"lowercase_expanded_terms\" : true,\n"
            + "    \"enable_position_increment\" : true,\n"
            + "    \"fuzziness\" : \"AUTO\",\n"
            + "    \"fuzzy_prefix_length\" : 0,\n"
            + "    \"fuzzy_max_expansions\" : 50,\n"
            + "    \"phrase_slop\" : 0,\n"
            + "    \"locale\" : \"und\",\n"
            + "    \"escape\" : false,\n"
            + "    \"boost\" : 1.0\n"
            + "  }\n"
            + "}";

    QueryStringQueryBuilder parsed = (QueryStringQueryBuilder) parseQuery(json);
    checkGeneratedJson(json, parsed);

    assertEquals(json, "this AND that OR thus", parsed.queryString());
    assertEquals(json, "content", parsed.defaultField());
  }
 @Override
 protected QueryStringQueryBuilder doCreateTestQueryBuilder() {
   int numTerms = randomIntBetween(0, 5);
   String query = "";
   for (int i = 0; i < numTerms; i++) {
     // min length 4 makes sure that the text is not an operator (AND/OR) so toQuery won't break
     query +=
         (randomBoolean() ? STRING_FIELD_NAME + ":" : "")
             + randomAsciiOfLengthBetween(4, 10)
             + " ";
   }
   QueryStringQueryBuilder queryStringQueryBuilder = new QueryStringQueryBuilder(query);
   if (randomBoolean()) {
     queryStringQueryBuilder.defaultField(
         randomBoolean() ? STRING_FIELD_NAME : randomAsciiOfLengthBetween(1, 10));
   }
   if (randomBoolean()) {
     int numFields = randomIntBetween(1, 5);
     for (int i = 0; i < numFields; i++) {
       String fieldName = randomBoolean() ? STRING_FIELD_NAME : randomAsciiOfLengthBetween(1, 10);
       if (randomBoolean()) {
         queryStringQueryBuilder.field(fieldName);
       } else {
         queryStringQueryBuilder.field(fieldName, randomFloat());
       }
     }
   }
   if (randomBoolean()) {
     queryStringQueryBuilder.defaultOperator(randomFrom(Operator.values()));
   }
   if (randomBoolean()) {
     // we only use string fields (either mapped or unmapped)
     queryStringQueryBuilder.fuzziness(randomFuzziness(STRING_FIELD_NAME));
   }
   if (randomBoolean()) {
     queryStringQueryBuilder.analyzer(randomAnalyzer());
   }
   if (randomBoolean()) {
     queryStringQueryBuilder.quoteAnalyzer(randomAnalyzer());
   }
   if (randomBoolean()) {
     queryStringQueryBuilder.allowLeadingWildcard(randomBoolean());
   }
   if (randomBoolean()) {
     queryStringQueryBuilder.analyzeWildcard(randomBoolean());
   }
   if (randomBoolean()) {
     queryStringQueryBuilder.maxDeterminizedStates(randomIntBetween(1, 100));
   }
   if (randomBoolean()) {
     queryStringQueryBuilder.lowercaseExpandedTerms(randomBoolean());
   }
   if (randomBoolean()) {
     queryStringQueryBuilder.autoGeneratePhraseQueries(randomBoolean());
   }
   if (randomBoolean()) {
     queryStringQueryBuilder.enablePositionIncrements(randomBoolean());
   }
   if (randomBoolean()) {
     queryStringQueryBuilder.lenient(randomBoolean());
   }
   if (randomBoolean()) {
     queryStringQueryBuilder.escape(randomBoolean());
   }
   if (randomBoolean()) {
     queryStringQueryBuilder.phraseSlop(randomIntBetween(0, 10));
   }
   if (randomBoolean()) {
     queryStringQueryBuilder.fuzzyMaxExpansions(randomIntBetween(0, 100));
   }
   if (randomBoolean()) {
     queryStringQueryBuilder.fuzzyPrefixLength(randomIntBetween(0, 10));
   }
   if (randomBoolean()) {
     queryStringQueryBuilder.fuzzyRewrite(getRandomRewriteMethod());
   }
   if (randomBoolean()) {
     queryStringQueryBuilder.rewrite(getRandomRewriteMethod());
   }
   if (randomBoolean()) {
     queryStringQueryBuilder.quoteFieldSuffix(randomAsciiOfLengthBetween(1, 3));
   }
   if (randomBoolean()) {
     queryStringQueryBuilder.tieBreaker(randomFloat());
   }
   if (randomBoolean()) {
     queryStringQueryBuilder.minimumShouldMatch(randomMinimumShouldMatch());
   }
   if (randomBoolean()) {
     queryStringQueryBuilder.useDisMax(randomBoolean());
   }
   if (randomBoolean()) {
     queryStringQueryBuilder.locale(randomLocale(getRandom()));
   }
   if (randomBoolean()) {
     queryStringQueryBuilder.timeZone(randomTimeZone());
   }
   return queryStringQueryBuilder;
 }