import re import unittest from pathlib import Path ROOT = Path(__file__).resolve().parent.parent WRAPPER = ROOT / "src" / "fortran" / "uel_3d_euler_beam_uel.for" def normalized_source() -> str: if not WRAPPER.exists(): raise AssertionError(f"missing Abaqus UEL wrapper: {WRAPPER}") return re.sub(r"\s+", " ", WRAPPER.read_text(encoding="utf-8").upper()) class Uel3dEulerBeamWrapperContractTests(unittest.TestCase): def test_wrapper_file_exists(self): self.assertTrue(WRAPPER.exists(), f"missing Abaqus UEL wrapper: {WRAPPER}") def test_wrapper_preserves_manual_uel_signature(self): text = normalized_source() self.assertIn("SUBROUTINE UEL(", text) self.assertIn("INCLUDE 'ABA_PARAM.INC'", text) for token in ( "RHS", "AMATRX", "SVARS", "ENERGY", "NDOFEL", "NRHS", "NSVARS", "PROPS", "NPROPS", "COORDS", "MCRD", "NNODE", "U", "DU", "V", "A", "JTYPE", "TIME", "DTIME", "KSTEP", "KINC", "JELEM", "PARAMS", "NDLOAD", "JDLTYP", "ADLMAG", "PREDEF", "NPREDF", "LFLAGS", "MLVARX", "DDLMAG", "MDLOAD", "PNEWDT", "JPROPS", "NJPROP", "PERIOD", ): self.assertRegex(text, rf"\b{token}\b") signature = text.split("INCLUDE 'ABA_PARAM.INC'", 1)[0] self.assertNotRegex(signature, r"\bSTATUS\b") def test_wrapper_uses_abaqus_dimensions_and_thin_adapter_call(self): text = normalized_source() for shape in ( "RHS(MLVARX,*)", "AMATRX(NDOFEL,NDOFEL)", "SVARS(*)", "ENERGY(8)", "PROPS(*)", "COORDS(MCRD,NNODE)", "U(NDOFEL)", "DU(MLVARX,*)", "V(NDOFEL)", "A(NDOFEL)", "TIME(2)", "PARAMS(*)", "JDLTYP(MDLOAD,*)", "ADLMAG(MDLOAD,*)", "DDLMAG(MDLOAD,*)", "PREDEF(2,NPREDF,NNODE)", "LFLAGS(*)", "JPROPS(*)", ): self.assertIn(shape, text) self.assertIn("USE UEL_3D_EULER_BEAM_ABI_ADAPTER", text) self.assertIn("CALL UEL3DEB_ABI_STATIC", text) self.assertIn("CALL XIT", text) if __name__ == "__main__": unittest.main()