IdentifiersJsonTest.java

/**
 * Copyright (c) 2025, RTE (http://www.rte-france.com)
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 * SPDX-License-Identifier: MPL-2.0
 */
package com.powsybl.iidm.network.identifiers;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.powsybl.commons.json.JsonUtil;
import com.powsybl.commons.test.AbstractSerDeTest;
import com.powsybl.iidm.network.identifiers.json.IdentifierDeserializer;
import com.powsybl.iidm.network.identifiers.json.IdentifierSerializer;
import org.junit.jupiter.api.Test;

import java.io.IOException;
import java.io.InputStream;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;

/**
 * @author Olivier Perrin {@literal <olivier.perrin at rte-france.com>}
 */
class IdentifiersJsonTest extends AbstractSerDeTest {

    private static final ObjectMapper MAPPER = new ObjectMapper().registerModule(new SimpleModule()
            .addSerializer(NetworkElementIdentifier.class, new IdentifierSerializer())
            .addDeserializer(NetworkElementIdentifier.class, new IdentifierDeserializer()));

    @Test
    void roundTripIdBasedNetworkElementIdentifier() throws IOException {
        NetworkElementIdentifier identifier = new IdBasedNetworkElementIdentifier("identifier0");
        roundTrip(identifier, "/identifier/idBasedNetworkElementIdentifier.json");
    }

    @Test
    void roundTripVoltageLevelAndOrderNetworkElementIdentifier() throws IOException {
        NetworkElementIdentifier identifier = new VoltageLevelAndOrderNetworkElementIdentifier("vlA", "vlB", '2');
        roundTrip(identifier, "/identifier/voltageLevelAndOrderNetworkElementIdentifier.json");
    }

    @Test
    void roundTripIdWithWildcardsNetworkElementIdentifier() throws IOException {
        NetworkElementIdentifier identifier = new IdWithWildcardsNetworkElementIdentifier("identifier?");
        roundTrip(identifier, "/identifier/idWithWildcardsNetworkElementIdentifierDefault.json");

        identifier = new IdWithWildcardsNetworkElementIdentifier("identifier��", "��", null);
        roundTrip(identifier, "/identifier/idWithWildcardsNetworkElementIdentifierCustom.json");
    }

    @Test
    void importIdWithWildcardsNetworkElementIdentifierLegacy() throws IOException {
        NetworkElementIdentifier identifier;
        try (InputStream is = getClass().getResourceAsStream("/identifier/idWithWildcardsNetworkElementIdentifierLegacy.json")) {
            identifier = MAPPER.readValue(is, NetworkElementIdentifier.class);
        }
        if (identifier instanceof IdWithWildcardsNetworkElementIdentifier i) {
            assertEquals("?", i.getWildcardCharacter());
        } else {
            fail();
        }
    }

    private void roundTrip(NetworkElementIdentifier identifier, String referenceFile) throws IOException {
        roundTripTest(identifier, (obj, jsonFile) -> JsonUtil.writeJson(jsonFile, obj, MAPPER),
                jsonFile -> JsonUtil.readJson(jsonFile, NetworkElementIdentifier.class, MAPPER), referenceFile);
    }
}