size_t TestEnergyMethod::run_test_(){
    CppTester tester("Testing EnergyMethod module base type");
 
    ModuleManager& mm=module_manager();
    OptionMap om;
    const auto& none=static_cast<pybind11::object>(pybind11::none());
    om.add_option("MAX_DERIV",OptionType::Int,false,none,"",pybind11::cast(0));
    om.add_option("FDIFF_DISPLACEMENT",OptionType::Float,false,none,"",pybind11::cast(0.005));
    om.add_option("FDIFF_STENCIL_SIZE",OptionType::Int,false,none,"",pybind11::cast(3));
    
    ModuleInfo minfo={"FakeEnergyMethod","c_module","EnergyMethod",
        "./TestEnergyMethod.so","1.0","A 3*Natoms H.O.",{""},{""}, om
    };
    mm.load_module_from_minfo(minfo,"Test the H.O.");
    auto egy_mod=create_child<EnergyMethod>("Test the H.O.");
    
    Wavefunction wfn;
    Atom H=create_atom({0.0,0.0,0.0},1),H1=create_atom({0.0,0.0,0.89},1);
    AtomSetUniverse MyU;
    MyU.insert(H);
    MyU.insert(H1);
    wfn.system=std::make_shared<const System>(System(MyU,true));
    
    //The right answers
    const std::vector<double> egy({0.39605});
    std::vector<double> grad(6,0.0);grad[5]=0.89;
    std::vector<double> hess(36,0.0);
    hess[0]=hess[7]=hess[14]=hess[21]=hess[28]=hess[35]=1.0;
    
    auto deriv=egy_mod->deriv(0,wfn);
    tester.test_equal("Energy works",egy,deriv.second);
    
    deriv=egy_mod->deriv(1,wfn);
    tester.test_equal("Grad has right dimensions",grad.size(),deriv.second.size());
    for(size_t i=0;i<grad.size();++i)
        tester.test_equal("FDiff grad comp "+to_string(i),grad[i],deriv.second[i]);
    
    deriv=egy_mod->deriv(2,wfn);
    tester.test_equal("Hessian has right dimensions",hess.size(),deriv.second.size());
    for(size_t i=0;i<hess.size();++i)
        tester.test_equal("FDiff Hessian comp "+to_string(i),hess[i],deriv.second[i]);
    
    tester.print_results();
    return tester.nfailed();
}