open Alcotest
open Particles
open Operators
open Mo.Guess
open Linear_algebra
    
let wd = Common.Qcaml.root ^ Filename.dir_sep ^ "test"

let test_case ao_basis =

  let test_hcore () =
    match make ~guess:`Hcore ao_basis with
    | Hcore matrix -> 
      let a = Matrix.to_array matrix in
      let reference =
        Matrix.add 
          (Ao.Basis.eN_ints  ao_basis)
          (Ao.Basis.kin_ints ao_basis)
        |> Matrix.to_array
      in
      Array.iteri (fun i x ->
        let message =
          Printf.sprintf "Guess line %d" (i)
        in
        check (array (float 1.e-15)) message a.(i) x) reference
    | _ -> assert false
  
  in
  [
    "HCore", `Quick, test_hcore;
  ]

let tests = 
  List.concat [ 
    let nuclei =
      wd ^ Filename.dir_sep ^ "water.xyz"
    |> Nuclei.of_xyz_file 
    in
    let basis_filename =
      wd ^ Filename.dir_sep ^ "cc-pvdz"
    in
    let rs = 0.5 in
    let operators = [ Operator.of_range_separation rs ] in
    let ao_basis = 
      Ao.Basis.of_nuclei_and_basis_filename ~kind:`Gaussian
        ~operators ~cartesian:false ~nuclei basis_filename
    in
    test_case ao_basis ;
  ]