For reasons that are a bit beyond me, `--host` and `PLATFORM_TRIPLET`
seem to be independent, in particular we've had an empty
`PLATFORM_TRIPLET`. This is unfortunate because `PLATFORM_TRIPLET`
is used to generate the SOABI config variable which in turn is used
to decide whether a .so file is a good match for loading. We'd like
for linux Pythons not to try to import emscripten .so files (it
raises `ImportError: some_file.so: invalid ELF header`). Similarly,
we'd like to avoid attempting to load linux .so files in wasm. These
platform tags are our friends.

Anyways, this PR sets `PLATFORM_TRIPLET` and ensures that .so files
built by pywasmcross are tagged with our SOABI tag.

I moved the .so file renaming from pywasmcross to buildpkg just
before running the post script. That is a better place to put it in
case the package wants to look at the .so file after linking it. It
might be surprised that we moved it.

I also improved the error message if we try to `loadWebAssemblyModule`
something that is actually say a Linux .so file and updated get_dynlibs
to filter out .so files that have an incompatible abi tag.
Set PLATFORM_TRIPLET, include platform in so names, only load compatible so files. For reasons that are a bit beyond me, `--host` and `PLATFORM_TRIPLET`
seem to be independent, in particular we've had an empty
`PLATFORM_TRIPLET`. This is unfortunate because `PLATFORM_TRIPLET`
is used to generate the SOABI config variable which in turn is used
to decide whether a .so file is a good match for loading. We'd like
for linux Pythons not to try to import emscripten .so files (it
raises `ImportError: some_file.so: invalid ELF header`). Similarly,
we'd like to avoid attempting to load linux .so files in wasm. These
platform tags are our friends.

Anyways, this PR sets `PLATFORM_TRIPLET` and ensures that .so files
built by pywasmcross are tagged with our SOABI tag.

I moved the .so file renaming from pywasmcross to buildpkg just
before running the post script. That is a better place to put it in
case the package wants to look at the .so file after linking it. It
might be surprised that we moved it.

I also improved the error message if we try to `loadWebAssemblyModule`
something that is actually say a Linux .so file and updated get_dynlibs
to filter out .so files that have an incompatible abi tag.
from pyodide_build.testing import run_in_pyodide


@run_in_pyodide(packages=["boost-histogram"])
def test_boost_histogram():
    import unittest

    import boost_histogram as bh

    h = bh.Histogram(bh.axis.Integer(0, 10))
    h.fill([1, 1, 1, 14])
    assert h[bh.underflow] == 0
    assert h[bh.loc(0)] == 0
    assert h[bh.loc(1)] == 3
    assert h[bh.overflow] == 1

    assert h.sum() == 3
    assert h.sum(flow=True) == 4
    assert h[sum] == 4

    h = bh.Histogram(bh.axis.Regular(10, 0, 10), bh.axis.Boolean())
    assert len(h.axes[0]) == 10
    assert len(h.axes[1]) == 2

    h.fill([0.5, 0.5, 3.5], [True, False, True])
    assert h[sum, bh.loc(True)] == 2
    assert h[sum, bh.loc(False)] == 1
    assert h[0, sum] == 2
    assert h[0, bh.loc(True)] == 1

    h = bh.Histogram(bh.axis.StrCategory([], growth=True))
    h.fill("fear leads to anger anger leads to hate hate leads to suffering".split())

    assert h[bh.loc("fear")] == 1
    assert h[bh.loc("anger")] == 2
    assert h[bh.loc("hate")] == 2
    assert h[bh.loc("to")] == 3

    # Test exception handling
    mean = bh.accumulators.Mean()

    with unittest.TestCase().assertRaises(KeyError):
        mean["invalid"]

from pyodide_build.testing import run_in_pyodide


@run_in_pyodide(packages=["boost-histogram"])
def test_boost_histogram():
    import unittest

    import boost_histogram as bh

    h = bh.Histogram(bh.axis.Integer(0, 10))
    h.fill([1, 1, 1, 14])
    assert h[bh.underflow] == 0
    assert h[bh.loc(0)] == 0
    assert h[bh.loc(1)] == 3
    assert h[bh.overflow] == 1

    assert h.sum() == 3
    assert h.sum(flow=True) == 4
    assert h[sum] == 4

    h = bh.Histogram(bh.axis.Regular(10, 0, 10), bh.axis.Boolean())
    assert len(h.axes[0]) == 10
    assert len(h.axes[1]) == 2

    h.fill([0.5, 0.5, 3.5], [True, False, True])
    assert h[sum, bh.loc(True)] == 2
    assert h[sum, bh.loc(False)] == 1
    assert h[0, sum] == 2
    assert h[0, bh.loc(True)] == 1

    h = bh.Histogram(bh.axis.StrCategory([], growth=True))
    h.fill("fear leads to anger anger leads to hate hate leads to suffering".split())

    assert h[bh.loc("fear")] == 1
    assert h[bh.loc("anger")] == 2
    assert h[bh.loc("hate")] == 2
    assert h[bh.loc("to")] == 3

    # Test exception handling
    mean = bh.accumulators.Mean()

    with unittest.TestCase().assertRaises(KeyError):
        mean["invalid"]
