/*
 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package com.sun.ts.tests.jsonp.api.mergetests;

import com.sun.ts.lib.util.TestUtil;
import com.sun.ts.tests.jsonp.api.common.TestResult;
import javax.json.JsonObject;

import static com.sun.ts.tests.jsonp.api.common.SimpleValues.*;

// $Id: MergeReplaceValue.java 74744 2016-12-05 15:09:04Z tkraus $
/**
 * RFC 7396: JavaScript Object Notation (JSON) Merge Patch compatibility tests.<br>
 * Checks scenario described in
 * {@see <a href="https://tools.ietf.org/html/rfc7396#section-1">RFC 7396: 1. Introduction</a>}:
 * If the target does contain the member, the value is replaced.
 */
public class MergeReplaceValue extends MergeCommon {

    /**
     * Creates an instance of RFC 7396 value replacing test.
     */
    MergeReplaceValue() {
        super();
    }

    /**
     * Test RFC 7396: Adding non existing values. Suite entry point.
     * @return Result of all tests in this suite.
     */
    TestResult test() {
        final TestResult result = new TestResult("RFC 7396: Replace existing values");
        TestUtil.logMsg("Testing RFC 7396: Replace existing values");
        testStringOnsimpleObject(result);
        testIntOnsimpleObject(result);
        testBoolOnsimpleObject(result);
        testObjectOnsimpleObject(result);
        return result;
    }

    /**
     * Test RFC 7396 patch and diff for {@code String} on simple JSON object.
     * @param result Tests result record.
     */
    private void testStringOnsimpleObject(final TestResult result) {
        TestUtil.logMsg(" - for String on simple JSON object");
        final JsonObject in = createSimpleObject();
        final JsonObject patch = createSimpleObjectMoveStr();
        final JsonObject check = createSimpleObjectMoveStr();
        simpleMerge(result, in, patch, check);
        simpleDiff(result, in, check, patch);
    }

    /**
     * Test RFC 7396 patch and diff for {@code int} on simple JSON object.
     * @param result Tests result record.
     */
    private void testIntOnsimpleObject(final TestResult result) {
        TestUtil.logMsg(" - for int on simple JSON object");
        final JsonObject in = createSimpleObject();
        final JsonObject patch = createSimpleObjectMoveInt();
        final JsonObject check = createSimpleObjectMoveInt();
        simpleMerge(result, in, patch, check);
        simpleDiff(result, in, check, patch);
    }

    /**
     * Test RFC 7396 patch and diff for {@code boolean} on simple JSON object.
     * @param result Tests result record.
     */
    private void testBoolOnsimpleObject(final TestResult result) {
        TestUtil.logMsg(" - for boolean on simple JSON object");
        final JsonObject in = createSimpleObject();
        final JsonObject patch = createSimpleObjectMoveBool();
        final JsonObject check = createSimpleObjectMoveBool();
        simpleMerge(result, in, patch, check);
        simpleDiff(result, in, check, patch);
    }

    /**
     * Test RFC 7396 patch and diff for {@code JsonObject} on compound JSON object.
     * @param result Tests result record.
     */
    private void testObjectOnsimpleObject(final TestResult result) {
        TestUtil.logMsg(" - for JsonObject on simple JSON object");
        final JsonObject in = createSimpleObject();
        final JsonObject patch = createSimpleObjectMoveObject();
        final JsonObject check = createSimpleObjectMoveObject();
        simpleMerge(result, in, patch, check);
        simpleDiff(result, in, check, patch);
    }

}
