@Test
 public void testNoReturnValue() throws Exception {
   final String fun = "function(doc) { }";
   final DocumentConverter converter = new DocumentConverter(context, view(fun));
   final Collection<Document> result = converter.convert(doc("{_id:\"hi\"}"), settings(), null);
   assertThat(result.size(), is(0));
 }
 @Test
 public void testRuntimeException() throws Exception {
   final DocumentConverter converter =
       new DocumentConverter(context, view("function(doc) {throw {bad : \"stuff\"}}"));
   final Collection<Document> result = converter.convert(doc("{_id:\"hello\"}"), settings(), null);
   assertThat(result.size(), is(0));
 }
 @Test
 public void testUndefinedReturn() throws Exception {
   final DocumentConverter converter =
       new DocumentConverter(context, view("function(doc) {return doc.nope;}"));
   final Collection<Document> result = converter.convert(doc("{_id:\"hello\"}"), settings(), null);
   assertThat(result.size(), is(0));
 }
 @Test
 public void testSingleDocumentReturn() throws Exception {
   final DocumentConverter converter =
       new DocumentConverter(context, view("function(doc) {return new Document();}"));
   final Collection<Document> result = converter.convert(doc("{_id:\"hello\"}"), settings(), null);
   assertThat(result.size(), is(1));
   assertThat(result.iterator().next().get("_id"), is("hello"));
 }
 @Test
 public void testConditionalOnNulls() throws Exception {
   final String fun =
       "function(doc) { if (doc.foo && doc.bar) { return new Document(); }; return null; }";
   final DocumentConverter converter = new DocumentConverter(context, view(fun));
   final Collection<Document> result =
       converter.convert(doc("{_id:\"hi\", foo: null, bar: null}"), settings(), null);
   assertThat(result.size(), is(0));
 }
 @Test
 public void testParseInt() throws Exception {
   final String fun =
       "function(doc) { var ret=new Document(); ret.add(parseInt(\"12.5\"), {type:\"int\", field:\"num\"});  return ret; }";
   final DocumentConverter converter = new DocumentConverter(context, view(fun));
   final Collection<Document> result = converter.convert(doc("{_id:\"hi\"}"), settings(), null);
   assertThat(result.size(), is(1));
   assertThat(result.iterator().next().getFieldable("num"), is(NumericField.class));
 }
 @Test
 public void testNullValue() throws Exception {
   final String fun = "function(doc) { var ret=new Document(); ret.add(doc.foo);  return ret; }";
   final DocumentConverter converter = new DocumentConverter(context, view(fun));
   final Collection<Document> result =
       converter.convert(doc("{_id:\"hi\", foo:null}"), settings(), null);
   assertThat(result.size(), is(1));
   assertThat(result.iterator().next().get("foo"), is(nullValue()));
 }
 @Test
 public void testNullAddsAreIgnored() throws Exception {
   final DocumentConverter converter =
       new DocumentConverter(
           context,
           view("function(doc) {var ret=new Document(); ret.add(doc.nope); return ret;}"));
   final Collection<Document> result = converter.convert(doc("{_id:\"hello\"}"), settings(), null);
   assertThat(result.size(), is(1));
 }
 @Test
 public void testAdd() throws Exception {
   final DocumentConverter converter =
       new DocumentConverter(
           context, view("function(doc) {var ret=new Document(); ret.add(doc.key); return ret;}"));
   final Collection<Document> result =
       converter.convert(doc("{_id:\"hello\", key:\"value\"}"), settings(), null);
   assertThat(result.size(), is(1));
   assertThat(result.iterator().next().get(Constants.DEFAULT_FIELD), is("value"));
 }
 @Test
 public void testDefaultValue() throws Exception {
   final String fun =
       "function(doc) { var ret=new Document(); ret.add(doc['arr'].join(' '));  return ret; }";
   final DocumentConverter converter = new DocumentConverter(context, view(fun));
   final Collection<Document> result =
       converter.convert(doc("{_id:\"hi\", arr:[\"1\",\"2\"]}"), settings(), null);
   assertThat(result.size(), is(1));
   assertThat(result.iterator().next().get("default"), is("1 2"));
 }
 @Test
 public void testDateObject2() throws Exception {
   final String fun =
       "function(doc) { var ret=new Document(); ret.add(new Date(\"January 6, 1972 16:05:00\"), {type:\"date\", field:\"num\"});  return ret; }";
   final DocumentConverter converter = new DocumentConverter(context, view(fun));
   final Collection<Document> result = converter.convert(doc("{_id:\"hi\"}"), settings(), null);
   assertThat(result.size(), is(1));
   assertThat(result.iterator().next().getFieldable("num"), is(NumericField.class));
   assertThat(
       (Long) ((NumericField) result.iterator().next().getFieldable("num")).getNumericValue(),
       is(63561900000L));
 }
 @Test
 public void testForLoopOverObject() throws Exception {
   final DocumentConverter converter =
       new DocumentConverter(
           context,
           view(
               "function(doc) {var ret=new Document(); for (var key in doc) { ret.add(doc[key]); } return ret; }"));
   final Collection<Document> result =
       converter.convert(doc("{_id:\"hello\", key:\"value\"}"), settings(), null);
   assertThat(result.size(), is(1));
   assertThat(result.iterator().next().get("_id"), is("hello"));
   assertThat(result.iterator().next().getValues(Constants.DEFAULT_FIELD)[0], is("hello"));
   assertThat(result.iterator().next().getValues(Constants.DEFAULT_FIELD)[1], is("value"));
 }
  @Test
  public void testForEverything() throws Exception {
    final DocumentConverter converter =
        new DocumentConverter(
            context,
            view(
                "function(doc) {var ret=new Document(); "
                    + "function idx(obj) {for (var key in obj) "
                    + "{switch (typeof obj[key]) {case 'object':idx(obj[key]); break; "
                    + "case 'function': break; default: ret.add(obj[key]); break;} } }; idx(doc); return ret; }"));

    final Collection<Document> result =
        converter.convert(
            doc("{_id:\"hello\", l1: { l2: {l3:[\"v3\", \"v4\"]}}}"), settings(), null);
    assertThat(result.iterator().next().getValues(Constants.DEFAULT_FIELD)[0], is("hello"));
    assertThat(result.iterator().next().getValues(Constants.DEFAULT_FIELD)[1], is("v3"));
    assertThat(result.iterator().next().getValues(Constants.DEFAULT_FIELD)[2], is("v4"));
  }
 @Test(expected = EvaluatorException.class)
 public void testBadCode() throws Exception {
   final DocumentConverter converter =
       new DocumentConverter(context, view("function(doc) { if (doc.) return null; }"));
   converter.convert(doc("{_id:\"hello\"}"), settings(), null);
 }