/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.johnzon.jsonlogic;

import org.apache.johnzon.jsonlogic.spi.AsyncOperator;
import org.apache.johnzon.jsonlogic.spi.Operator;
import org.junit.Test;

import javax.json.Json;
import javax.json.JsonBuilderFactory;
import javax.json.JsonObject;
import javax.json.JsonValue;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicReference;

import static java.util.Collections.emptyMap;
import static org.junit.Assert.assertEquals;

public class JohnzonJsonLogicTest {
    private final JohnzonJsonLogic jsonLogic = new JohnzonJsonLogic();
    private final JsonBuilderFactory builderFactory = Json.createBuilderFactory(emptyMap());

    @Test
    public void stage() throws InterruptedException {
        // if the async exec is too immediate we will execute the thenAccept callback in main thread
        // which is not the goal of this test so let's ensure we are in the expected case
        final CountDownLatch waitChainReady = new CountDownLatch(1);

        final JohnzonJsonLogic jsonLogic = new JohnzonJsonLogic()
                .registerOperator("async", new Operator() {
                    @Override
                    public CompletionStage<JsonValue> applyStage(final JohnzonJsonLogic logic,
                                                                 final JsonValue config,
                                                                 final JsonValue params) {
                        return logic.applyStage(
                                builderFactory.createObjectBuilder().add("async2", "ok").build(),
                                builderFactory.createObjectBuilder().add("p2", "1").build())
                                .thenApplyAsync(
                                        previous -> builderFactory.createObjectBuilder()
                                                .add("thread", Thread.currentThread().getName())
                                                .add("config", config)
                                                .add("params", params)
                                                .add("exec2", previous)
                                                .build(),
                                        r -> new Thread(r, "async").start());
                    }

                    @Override
                    public JsonValue apply(final JohnzonJsonLogic logic, final JsonValue config, final JsonValue params) {
                        throw new UnsupportedOperationException();
                    }
                })
                .registerOperator("async2", new AsyncOperator() {
                    @Override
                    public CompletionStage<JsonValue> applyStage(final JohnzonJsonLogic logic,
                                                                 final JsonValue config,
                                                                 final JsonValue params) {
                        return CompletableFuture.supplyAsync(() -> {
                            try {
                                waitChainReady.await();
                            } catch (final InterruptedException e) {
                                Thread.currentThread().interrupt();
                            }
                            return builderFactory.createObjectBuilder()
                                    .add("thread2", Thread.currentThread().getName())
                                    .add("config2", config)
                                    .add("params2", params)
                                    .build();
                        }, r -> new Thread(r, "async2").start());
                    }

                    @Override
                    public JsonValue apply(final JohnzonJsonLogic logic, final JsonValue config, final JsonValue params) {
                        throw new UnsupportedOperationException();
                    }
                });

        final CountDownLatch latch = new CountDownLatch(1); // if we use Future.get we break stage threading
        final AtomicReference<JsonValue> output = new AtomicReference<>();
        jsonLogic
                .applyStage(
                        builderFactory.createObjectBuilder()
                                .add("async", "a")
                                .build(),
                        builderFactory.createObjectBuilder()
                                .add("p1", "0")
                                .build())
                .thenAccept(result -> {
                    output.set(builderFactory.createObjectBuilder()
                            .add("exec1", result)
                            .add("thenSyncThread", Thread.currentThread().getName())
                            .build());
                    latch.countDown();
                });
        waitChainReady.countDown();
        latch.await();
        assertEquals("" +
                        "{" +
                        "\"exec1\":{\"thread\":\"async\",\"config\":\"a\",\"params\":{\"p1\":\"0\"}," +
                        "\"exec2\":{\"thread2\":\"async2\",\"config2\":\"ok\",\"params2\":{\"p2\":\"1\"}}}," +
                        "\"thenSyncThread\":\"async\"" +
                        "}" +
                        "",
                output.get().toString());
    }

    @Test
    public void varObjectString() {
        assertEquals(Json.createValue("b"), jsonLogic.apply(
                builderFactory.createObjectBuilder()
                        .add("var", "a")
                        .build(),
                builderFactory.createObjectBuilder()
                        .add("a", "b")
                        .add("c", "d")
                        .build()));
    }

    @Test
    public void varObjectPtr() {
        assertEquals(Json.createValue("ok"), jsonLogic.apply(
                builderFactory.createObjectBuilder()
                        .add("var", "a.b.0")
                        .build(),
                builderFactory.createObjectBuilder()
                        .add("a", builderFactory.createObjectBuilder()
                                .add("b", builderFactory.createArrayBuilder()
                                        .add("ok")))
                        .build()));
    }

    @Test
    public void varObjectStringMissing() {
        assertEquals(JsonValue.NULL, jsonLogic.apply(
                builderFactory.createObjectBuilder()
                        .add("var", "a")
                        .build(),
                builderFactory.createObjectBuilder()
                        .add("c", "d")
                        .build()));
    }

    @Test
    public void varArrayInt() {
        assertEquals(Json.createValue("b"), jsonLogic.apply(
                builderFactory.createObjectBuilder()
                        .add("var", 1)
                        .build(),
                builderFactory.createArrayBuilder()
                        .add("a")
                        .add("b")
                        .build()));
    }

    @Test
    public void varObjectDefault() {
        assertEquals(Json.createValue(26), jsonLogic.apply(
                builderFactory.createObjectBuilder()
                        .add("var", builderFactory.createArrayBuilder().add("z").add(26))
                        .build(),
                builderFactory.createObjectBuilder()
                        .add("a", "b")
                        .add("c", "d")
                        .build()));
    }

    @Test
    public void varArrayDefault() {
        assertEquals(Json.createValue(26), jsonLogic.apply(
                builderFactory.createObjectBuilder()
                        .add("var", builderFactory.createArrayBuilder().add(10).add(26))
                        .build(),
                builderFactory.createArrayBuilder()
                        .add("a")
                        .add("b")
                        .build()));
    }

    @Test
    public void missing() {
        final JsonObject value = builderFactory.createObjectBuilder()
                .add("a", 1)
                .add("b", 2)
                .build();
        assertEquals(
                JsonValue.EMPTY_JSON_ARRAY,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("missing",
                                        builderFactory.createArrayBuilder()
                                                .add("a")
                                                .add("b"))
                                .build(),
                        value));
        assertEquals(
                builderFactory.createArrayBuilder()
                        .add("c")
                        .build(),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("missing", builderFactory.createArrayBuilder()
                                        .add("a")
                                        .add("b")
                                        .add("c"))
                                .build(),
                        value));
    }

    @Test
    public void missingSome() {
        final JsonObject value = builderFactory.createObjectBuilder()
                .add("a", 1)
                .add("b", 2)
                .build();
        assertEquals(
                JsonValue.EMPTY_JSON_ARRAY,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("missing_some",
                                        builderFactory.createArrayBuilder()
                                                .add(1)
                                                .add(builderFactory.createArrayBuilder()
                                                        .add("a")
                                                        .add("c")
                                                        .add("d")))
                                .build(),
                        value));
        assertEquals(
                builderFactory.createArrayBuilder()
                        .add("c")
                        .add("d")
                        .build(),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("missing_some", builderFactory.createArrayBuilder()
                                        .add(2)
                                        .add(builderFactory.createArrayBuilder()
                                                .add("a")
                                                .add("c")
                                                .add("d")))
                                .build(),
                        value));
    }

    @Test
    public void ifStatic() {
        assertEquals(
                Json.createValue("yes"),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("if",
                                        builderFactory.createArrayBuilder()
                                                .add(true)
                                                .add("yes")
                                                .add("false"))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
        assertEquals(
                Json.createValue("no"),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("if",
                                        builderFactory.createArrayBuilder()
                                                .add(false)
                                                .add("yes")
                                                .add("no"))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
    }

    @Test
    public void ifElsIfElseWithVarEval() {
        assertEquals(
                Json.createValue("liquid"),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("if",
                                        builderFactory.createArrayBuilder()
                                                .add(builderFactory.createObjectBuilder()
                                                        .add("<", builderFactory.createArrayBuilder()
                                                                .add(builderFactory.createObjectBuilder()
                                                                        .add("var", "temp"))
                                                                .add(0)))
                                                .add("freezing")
                                                .add(builderFactory.createObjectBuilder()
                                                        .add("<", builderFactory.createArrayBuilder()
                                                                .add(builderFactory.createObjectBuilder()
                                                                        .add("var", "temp"))
                                                                .add(100)))
                                                .add("liquid")
                                                .add("gas"))
                                .build(),
                        builderFactory.createObjectBuilder().add("temp", 55).build()));
    }

    @Test
    public void lessThan() {
        assertEquals(
                JsonValue.TRUE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("<", builderFactory.createArrayBuilder()
                                        .add(builderFactory.createObjectBuilder()
                                                .add("var", "temp"))
                                        .add(100))
                                .build(),
                        builderFactory.createObjectBuilder().add("temp", 99).build()));
        assertEquals(
                JsonValue.FALSE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("<", builderFactory.createArrayBuilder()
                                        .add(builderFactory.createObjectBuilder()
                                                .add("var", "temp"))
                                        .add(100))
                                .build(),
                        builderFactory.createObjectBuilder().add("temp", 100).build()));
    }

    @Test
    public void lessOrEqualsThan() {
        assertEquals(
                JsonValue.TRUE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("<=", builderFactory.createArrayBuilder()
                                        .add(builderFactory.createObjectBuilder()
                                                .add("var", "temp"))
                                        .add(100))
                                .build(),
                        builderFactory.createObjectBuilder().add("temp", 100).build()));
        assertEquals(
                JsonValue.FALSE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("<=", builderFactory.createArrayBuilder()
                                        .add(builderFactory.createObjectBuilder()
                                                .add("var", "temp"))
                                        .add(100))
                                .build(),
                        builderFactory.createObjectBuilder().add("temp", 101).build()));
    }

    @Test
    public void greaterThan() {
        assertEquals(
                JsonValue.TRUE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add(">", builderFactory.createArrayBuilder()
                                        .add(builderFactory.createObjectBuilder()
                                                .add("var", "temp"))
                                        .add(100))
                                .build(),
                        builderFactory.createObjectBuilder().add("temp", 101).build()));
        assertEquals(
                JsonValue.FALSE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add(">", builderFactory.createArrayBuilder()
                                        .add(builderFactory.createObjectBuilder()
                                                .add("var", "temp"))
                                        .add(100))
                                .build(),
                        builderFactory.createObjectBuilder().add("temp", 100).build()));
    }

    @Test
    public void greaterOrEqualsThan() {
        assertEquals(
                JsonValue.TRUE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add(">=", builderFactory.createArrayBuilder()
                                        .add(builderFactory.createObjectBuilder()
                                                .add("var", "temp"))
                                        .add(100))
                                .build(),
                        builderFactory.createObjectBuilder().add("temp", 100).build()));
        assertEquals(
                JsonValue.FALSE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add(">=", builderFactory.createArrayBuilder()
                                        .add(builderFactory.createObjectBuilder()
                                                .add("var", "temp"))
                                        .add(100))
                                .build(),
                        builderFactory.createObjectBuilder().add("temp", 99).build()));
    }

    @Test
    public void equalsCoercion() {
        assertEquals(
                JsonValue.TRUE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("==", builderFactory.createArrayBuilder()
                                        .add(1)
                                        .add(1))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
        assertEquals(
                JsonValue.TRUE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("==", builderFactory.createArrayBuilder()
                                        .add("1")
                                        .add(1))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
        assertEquals(
                JsonValue.TRUE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("==", builderFactory.createArrayBuilder()
                                        .add(1)
                                        .add("1"))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
        assertEquals(
                JsonValue.TRUE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("==", builderFactory.createArrayBuilder()
                                        .add(0)
                                        .add(false))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
        assertEquals(
                JsonValue.FALSE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("==", builderFactory.createArrayBuilder()
                                        .add(1)
                                        .add(false))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
    }

    @Test
    public void equalsNoCoercion() {
        assertEquals(
                JsonValue.TRUE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("===", builderFactory.createArrayBuilder()
                                        .add(1)
                                        .add(1))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
        assertEquals(
                JsonValue.FALSE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("===", builderFactory.createArrayBuilder()
                                        .add("1")
                                        .add(1))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
        assertEquals(
                JsonValue.FALSE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("===", builderFactory.createArrayBuilder()
                                        .add(1)
                                        .add("1"))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
        assertEquals(
                JsonValue.FALSE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("===", builderFactory.createArrayBuilder()
                                        .add(0)
                                        .add(false))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
        assertEquals(
                JsonValue.FALSE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("===", builderFactory.createArrayBuilder()
                                        .add(1)
                                        .add(false))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
    }

    @Test
    public void negate() {
        assertEquals(
                JsonValue.FALSE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("!", true)
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
        assertEquals(
                JsonValue.FALSE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("!", builderFactory.createArrayBuilder().add(true).build())
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
    }

    @Test
    public void booleanEvaluation() {
        assertEquals(
                JsonValue.TRUE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("!!", true)
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
        assertEquals(
                JsonValue.TRUE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("!!", "a")
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
        assertEquals(
                JsonValue.FALSE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("!!", "")
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
        assertEquals(
                JsonValue.TRUE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("!!", builderFactory.createArrayBuilder().add(true).build())
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
    }

    @Test
    public void and() {
        assertEquals(
                JsonValue.FALSE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("and", builderFactory.createArrayBuilder()
                                        .add(false)
                                        .add(true))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
        assertEquals(
                Json.createValue("a"),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("and", builderFactory.createArrayBuilder()
                                        .add(true)
                                        .add("a"))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
    }

    @Test
    public void or() {
        assertEquals(
                JsonValue.TRUE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("or", builderFactory.createArrayBuilder()
                                        .add(false)
                                        .add(true))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
        assertEquals(
                JsonValue.TRUE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("or", builderFactory.createArrayBuilder()
                                        .add(true)
                                        .add("a"))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
        assertEquals(
                Json.createValue("a"),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("or", builderFactory.createArrayBuilder()
                                        .add("a")
                                        .add(true))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
        assertEquals(
                Json.createValue("a"),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("or", builderFactory.createArrayBuilder()
                                        .add(false)
                                        .add(JsonValue.EMPTY_JSON_ARRAY)
                                        .add("a")
                                        .add(true))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
    }

    @Test
    public void min() {
        assertEquals(
                Json.createValue(100.),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("min", builderFactory.createArrayBuilder()
                                        .add(100)
                                        .add(200)
                                        .add(300))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
    }

    @Test
    public void max() {
        assertEquals(
                Json.createValue(300.),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("max", builderFactory.createArrayBuilder()
                                        .add(100)
                                        .add(200)
                                        .add(300))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
    }

    @Test
    public void plus() {
        assertEquals(
                Json.createValue(6.),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("+", builderFactory.createArrayBuilder()
                                        .add(4)
                                        .add(2))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
        assertEquals(
                Json.createValue(3.14),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("+", "3.14")
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
        assertEquals(
                Json.createValue(7.),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("+", builderFactory.createArrayBuilder()
                                        .add(4)
                                        .add(2)
                                        .add(1))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
    }

    @Test
    public void minus() {
        assertEquals(
                Json.createValue(2.),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("-", builderFactory.createArrayBuilder()
                                        .add(4)
                                        .add(2))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
        assertEquals(
                Json.createValue(-2.),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("-", 2)
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
    }

    @Test
    public void multiply() {
        assertEquals(
                Json.createValue(8.),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("*", builderFactory.createArrayBuilder()
                                        .add(4)
                                        .add(2))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
        assertEquals(
                Json.createValue(24.),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("*", builderFactory.createArrayBuilder()
                                        .add(4)
                                        .add(3)
                                        .add(2))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
    }

    @Test
    public void divide() {
        assertEquals(
                Json.createValue(2.),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("/", builderFactory.createArrayBuilder()
                                        .add(4)
                                        .add(2))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
    }

    @Test
    public void modulo() {
        assertEquals(
                Json.createValue(0.),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("%", builderFactory.createArrayBuilder()
                                        .add(4)
                                        .add(2))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
        assertEquals(
                Json.createValue(1.),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("%", builderFactory.createArrayBuilder()
                                        .add(5)
                                        .add(2))
                                .build(),
                        JsonValue.EMPTY_JSON_OBJECT));
    }

    @Test
    public void map() {
        assertEquals(
                builderFactory.createArrayBuilder()
                        .add(2.)
                        .add(4.)
                        .add(6.)
                        .add(8.)
                        .add(10.)
                        .build(),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("map", builderFactory.createArrayBuilder()
                                        .add(builderFactory.createObjectBuilder()
                                                .add("var", "integers"))
                                        .add(builderFactory.createObjectBuilder()
                                                .add("*", builderFactory.createArrayBuilder()
                                                        .add(builderFactory.createObjectBuilder()
                                                                .add("var", ""))
                                                        .add(2))))
                                .build(),
                        builderFactory.createObjectBuilder()
                                .add("integers", builderFactory.createArrayBuilder()
                                        .add(1)
                                        .add(2)
                                        .add(3)
                                        .add(4)
                                        .add(5))
                                .build()));
    }

    @Test
    public void filter() {
        assertEquals(
                builderFactory.createArrayBuilder()
                        .add(1)
                        .add(3)
                        .add(5)
                        .build(),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("filter", builderFactory.createArrayBuilder()
                                        .add(builderFactory.createObjectBuilder()
                                                .add("var", "integers"))
                                        .add(builderFactory.createObjectBuilder()
                                                .add("%", builderFactory.createArrayBuilder()
                                                        .add(builderFactory.createObjectBuilder()
                                                                .add("var", ""))
                                                        .add(2))))
                                .build(),
                        builderFactory.createObjectBuilder()
                                .add("integers", builderFactory.createArrayBuilder()
                                        .add(1)
                                        .add(2)
                                        .add(3)
                                        .add(4)
                                        .add(5))
                                .build()));
    }

    @Test
    public void reduce() {
        assertEquals(
                Json.createValue(15.),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("reduce", builderFactory.createArrayBuilder()
                                        .add(builderFactory.createObjectBuilder()
                                                .add("var", "integers"))
                                        .add(builderFactory.createObjectBuilder()
                                                .add("+", builderFactory.createArrayBuilder()
                                                        .add(builderFactory.createObjectBuilder()
                                                                .add("var", "current"))
                                                        .add(builderFactory.createObjectBuilder()
                                                                .add("var", "accumulator"))))
                                        .add(0))
                                .build(),
                        builderFactory.createObjectBuilder()
                                .add("integers", builderFactory.createArrayBuilder()
                                        .add(1)
                                        .add(2)
                                        .add(3)
                                        .add(4)
                                        .add(5))
                                .build()));
    }

    @Test
    public void all() {
        assertEquals(
                JsonValue.TRUE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("all", builderFactory.createArrayBuilder()
                                        .add(builderFactory.createArrayBuilder()
                                                .add(1)
                                                .add(2)
                                                .add(3))
                                        .add(builderFactory.createObjectBuilder()
                                                .add(">", builderFactory.createArrayBuilder()
                                                        .add(builderFactory.createObjectBuilder()
                                                                .add("var", ""))
                                                        .add(0))))
                                .build(),
                        JsonValue.EMPTY_JSON_ARRAY));
        assertEquals(
                JsonValue.FALSE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("all", builderFactory.createArrayBuilder()
                                        .add(builderFactory.createArrayBuilder()
                                                .add(1)
                                                .add(2)
                                                .add(3))
                                        .add(builderFactory.createObjectBuilder()
                                                .add("<", builderFactory.createArrayBuilder()
                                                        .add(builderFactory.createObjectBuilder()
                                                                .add("var", ""))
                                                        .add(3))))
                                .build(),
                        JsonValue.EMPTY_JSON_ARRAY));
    }

    @Test
    public void some() {
        assertEquals(
                JsonValue.TRUE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("some", builderFactory.createArrayBuilder()
                                        .add(builderFactory.createArrayBuilder()
                                                .add(1)
                                                .add(2)
                                                .add(3))
                                        .add(builderFactory.createObjectBuilder()
                                                .add(">", builderFactory.createArrayBuilder()
                                                        .add(builderFactory.createObjectBuilder()
                                                                .add("var", ""))
                                                        .add(2))))
                                .build(),
                        JsonValue.EMPTY_JSON_ARRAY));
        assertEquals(
                JsonValue.FALSE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("some", builderFactory.createArrayBuilder()
                                        .add(builderFactory.createArrayBuilder()
                                                .add(1)
                                                .add(2)
                                                .add(3))
                                        .add(builderFactory.createObjectBuilder()
                                                .add(">", builderFactory.createArrayBuilder()
                                                        .add(builderFactory.createObjectBuilder()
                                                                .add("var", ""))
                                                        .add(3))))
                                .build(),
                        JsonValue.EMPTY_JSON_ARRAY));
    }

    @Test
    public void none() {
        assertEquals(
                JsonValue.TRUE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("none", builderFactory.createArrayBuilder()
                                        .add(builderFactory.createArrayBuilder()
                                                .add(1)
                                                .add(2)
                                                .add(3))
                                        .add(builderFactory.createObjectBuilder()
                                                .add(">", builderFactory.createArrayBuilder()
                                                        .add(builderFactory.createObjectBuilder()
                                                                .add("var", ""))
                                                        .add(3))))
                                .build(),
                        JsonValue.EMPTY_JSON_ARRAY));
        assertEquals(
                JsonValue.FALSE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("none", builderFactory.createArrayBuilder()
                                        .add(builderFactory.createArrayBuilder()
                                                .add(1)
                                                .add(2)
                                                .add(3))
                                        .add(builderFactory.createObjectBuilder()
                                                .add("<", builderFactory.createArrayBuilder()
                                                        .add(builderFactory.createObjectBuilder()
                                                                .add("var", ""))
                                                        .add(2))))
                                .build(),
                        JsonValue.EMPTY_JSON_ARRAY));
    }

    @Test
    public void merge() {
        assertEquals(
                builderFactory.createArrayBuilder()
                        .add(1)
                        .add(2)
                        .add(3)
                        .add("4")
                        .build(),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("merge", builderFactory.createArrayBuilder()
                                        .add(builderFactory.createArrayBuilder()
                                                .add(1)
                                                .add(2))
                                        .add(3)
                                        .add("4"))
                                .build(),
                        JsonValue.EMPTY_JSON_ARRAY));
    }

    @Test
    public void in() {
        assertEquals(
                JsonValue.TRUE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("in", builderFactory.createArrayBuilder()
                                        .add(2)
                                        .add(builderFactory.createArrayBuilder()
                                                .add(1)
                                                .add(2)))
                                .build(),
                        JsonValue.EMPTY_JSON_ARRAY));
        assertEquals(
                JsonValue.FALSE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("in", builderFactory.createArrayBuilder()
                                        .add(3)
                                        .add(builderFactory.createArrayBuilder()
                                                .add(1)
                                                .add(2)))
                                .build(),
                        JsonValue.EMPTY_JSON_ARRAY));
        assertEquals(
                JsonValue.TRUE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("in", builderFactory.createArrayBuilder()
                                        .add("ay")
                                        .add("may"))
                                .build(),
                        JsonValue.EMPTY_JSON_ARRAY));
        assertEquals(
                JsonValue.FALSE,
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("in", builderFactory.createArrayBuilder()
                                        .add("cem")
                                        .add("may"))
                                .build(),
                        JsonValue.EMPTY_JSON_ARRAY));
    }

    @Test
    public void cat() {
        assertEquals(
                Json.createValue("hello json"),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("cat", builderFactory.createArrayBuilder()
                                        .add("hell")
                                        .add("o json"))
                                .build(),
                        JsonValue.EMPTY_JSON_ARRAY));
    }

    @Test
    public void substr() {
        assertEquals(
                Json.createValue("logic"),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("substr", builderFactory.createArrayBuilder()
                                        .add("jsonlogic")
                                        .add(4))
                                .build(),
                        JsonValue.EMPTY_JSON_ARRAY));
        assertEquals(
                Json.createValue("logic"),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("substr", builderFactory.createArrayBuilder()
                                        .add("jsonlogic")
                                        .add(-5))
                                .build(),
                        JsonValue.EMPTY_JSON_ARRAY));
        assertEquals(
                Json.createValue("son"),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("substr", builderFactory.createArrayBuilder()
                                        .add("jsonlogic")
                                        .add(1)
                                        .add(3))
                                .build(),
                        JsonValue.EMPTY_JSON_ARRAY));
        assertEquals(
                Json.createValue("log"),
                jsonLogic.apply(
                        builderFactory.createObjectBuilder()
                                .add("substr", builderFactory.createArrayBuilder()
                                        .add("jsonlogic")
                                        .add(4)
                                        .add(-2))
                                .build(),
                        JsonValue.EMPTY_JSON_ARRAY));
    }
}
