#include "libo3d"

o3d::Display disp(nil, nil);

// Declare "hidden" HW externs just to get coverage
namespace o3d {
extern
    _objName, _intCylGen, _objAddRef,
    _objParent, _intMakeBox, _intReadPNG,
    _intReadPPM, _objDestroy, _objInquire,
    _intMakeCone, _intMakeRing, _intPlaneGen,
    _intSetError, _dispGuiText, _dispScissor,
    _objPropList, _intMakeTorus, _intSphereGen,
    _dispCallList, _dispDrawMesh, _dispGuiLines,
    _dispOpenList, _dispViewport, _intMakeSphere,
    _intOrientData, _intSmoothMesh, _dispCloseList,
    _dispDrawQuads, _dispDrawStrip, _dispGuiRaster,
    _dispSurfAttrs, _intCreateImage, _intMakeSurfRev,
    _intMakeTerrain, _intModifyAlpha, _intTextureData,
    _dispBoundsSize, _dispGuiPolygon, _intArrayToImage,
    _intDestroyImage, _intMakeThinRing, _dispCallGuiList,
    _dispDestroyList, _dispDrawMarkers, _dispDrawPolygon,
    _dispGetMousePos, _dispGuiPolyline, _dispOpenGuiList,
    _dispCloseGuiList, _dispDrawPolyline, _dispGuiRectangle,
    _dispBoundsVisible, _dispCreateTexture, _dispGetVisibility,
    _dispSetVisibility, _dispCurrentTexture, _dispDestroyGuiList,
    _dispDestroyTexture, _dispPositionalLight, _dispSetInvisibility,
    _dispDrawIndexedTriangles;
}

proc main()
{
    var procs = {
        o3d::_objName, o3d::_intCylGen, o3d::_objAddRef,
        o3d::_objParent, o3d::_intMakeBox, o3d::_intReadPNG,
        o3d::_intReadPPM, o3d::_objDestroy, o3d::_objInquire,
        o3d::_intMakeCone, o3d::_intMakeRing, o3d::_intPlaneGen,
        o3d::_intSetError, o3d::_dispGuiText, o3d::_dispScissor,
        o3d::_objPropList, o3d::_intMakeTorus, o3d::_intSphereGen,
        o3d::_dispCallList, o3d::_dispDrawMesh, o3d::_dispGuiLines,
        o3d::_dispOpenList, o3d::_dispViewport, o3d::_intMakeSphere,
        o3d::_intOrientData, o3d::_intSmoothMesh, o3d::_dispCloseList,
        o3d::_dispDrawQuads, o3d::_dispDrawStrip, o3d::_dispGuiRaster,
        o3d::_dispSurfAttrs, o3d::_intCreateImage, o3d::_intMakeSurfRev,
        o3d::_intMakeTerrain, o3d::_intModifyAlpha, o3d::_intTextureData,
        o3d::_dispBoundsSize, o3d::_dispGuiPolygon, o3d::_intArrayToImage,
        o3d::_intDestroyImage, o3d::_intMakeThinRing, o3d::_dispCallGuiList,
        o3d::_dispDestroyList, o3d::_dispDrawMarkers, o3d::_dispDrawPolygon,
        o3d::_dispGetMousePos, o3d::_dispGuiPolyline, o3d::_dispOpenGuiList,
        o3d::_dispCloseGuiList, o3d::_dispDrawPolyline, o3d::_dispGuiRectangle,
        o3d::_dispBoundsVisible, o3d::_dispCreateTexture, o3d::_dispGetVisibility,
        o3d::_dispSetVisibility, o3d::_dispCurrentTexture,
        o3d::_dispDestroyGuiList, o3d::_dispDestroyTexture,
        o3d::_dispPositionalLight, o3d::_dispSetInvisibility,
        o3d::_dispDrawIndexedTriangles,
        o3d::Identity, o3d::Scale, o3d::RotateX,
        o3d::RotateY, o3d::RotateZ, o3d::RotateAxis,
        o3d::MatMult, o3d::MakeMatrix, o3d::Transform,
        o3d::Transform4d, o3d::TransformPersp, o3d::TransformData,
        o3d::InvertMat, o3d::GetError, o3d::CalcWPV,
        o3d::FindClass, o3d::FindObject, o3d::ParseFile,
        o3d::ParseArray, o3d::WriteAscii
    };

    disp.chooseVisual(o3d::VIS_DBUFF, 0);
    var draw = disp.createWindow("test", 100, 100, 256, 256, 0);
    disp.makeCurrent(draw);

    forall (procs[i]) {
        try {
            // These should all throw errors...
            procs[i]();
        }
        catch (e) {
        }
    }

    var mat = new PackFloat(16);
    o3d::MakeMatrix({1.,1.,1.,0.,0.,0.,0.,0.,0.}, mat);
}