## SPDX-License-Identifier: BSD-2-Clause
##
## Copyright 2020-2025 Inria & Université de Bordeaux
##
## Redistribution and use in source and binary forms, with or without
## modification, are permitted provided that the following conditions
## are met:
##
## 1. Redistributions of source code must retain the above copyright
## notice, this list of conditions and the following disclaimer.
##
## 2. Redistributions in binary form must reproduce the above
## copyright notice, this list of conditions and the following
## disclaimer in the documentation and/or other materials provided
## with the distribution.
##
## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
## CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES,
## INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
## DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
## BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
## EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
## TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
## ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
## TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
## THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
## SUCH DAMAGE.
##

import tempfile
import scotchpy as SCOTCH
import os
import importlib.resources

_data_dir = importlib.resources.files('scotchpy').joinpath("data")

# taken from check/test_scotch_graph_order.c


def testOrder():
    for filename in (os.path.join(_data_dir, "bump.grf"),
                     os.path.join(_data_dir, "bump_b100000.grf")):
        try:
            graf = SCOTCH.Graph()
        except SCOTCH.LibraryError:
            assert False, "cannot initialize graph"
            raise

        with open(filename) as fp:
            try:
                graf.load(fp, -1, 0)
            except SCOTCH.LibraryError:
                assert False, "cannot load graph " + filename
                raise

        baseval, vertnbr, _, _, _, _, _, _, _ = graf.data()

        listnbr = (vertnbr + 1) // 2
        listtab = [0] * listnbr
        vertnum = baseval + (listnbr // 4)  # Initialize vertnum

        for listnum in range(listnbr):
            listtab[listnum] = vertnum
            vertnum += 1

        with tempfile.TemporaryFile() as fp:
            try:

                strat = SCOTCH.Strat(init=False)
                strat.init()
            except SCOTCH.LibraryError:
                assert False, "cannot initialize strategy"
                raise

            ordering = SCOTCH.Ordering()

            try:
                graf.order_init(ordering)
            except SCOTCH.LibraryError:
                assert False, "cannot initialize ordering (1)"
                raise

            # return # unexpected failure
            # pdb.set_trace()
            try:
                graf.order_compute(ordering, strat)
            except SCOTCH.LibraryError:
                assert False, "cannot order graph"
                raise
            try:
                graf.order_check(ordering)
            except SCOTCH.LibraryError:
                assert False, "invalid ordering (1)"
                raise

            graf.order_save(ordering, fp)
            graf.order_save_map(ordering, fp)
            graf.order_save_tree(ordering, fp)

            graf.order_exit(ordering)

            try:
                graf.order_init(ordering)
            except SCOTCH.LibraryError:
                assert False, "cannot initialize ordering (2)"
                raise

            try:
                graf.order_compute_list(ordering, listtab, strat)
            except SCOTCH.LibraryError:
                assert False, "cannot order induced graph"
                raise

            try:
                graf.order_check(ordering)
            except SCOTCH.LibraryError:
                assert False, "invalid ordering (2)"
                raise

            graf.order_save(ordering, fp)
            graf.order_save_map(ordering, fp)
            graf.order_save_tree(ordering, fp)
