from pathlib import Path
import tempfile, subprocess, json, sys
qe_in="""&CONTROL
 calculation='scf',
 prefix='sic',
/
&SYSTEM
 ibrav=4,
 celldm(1)=5.84644221204,
 celldm(3)=1.64084838697,
 nat=4,
 ntyp=2,
 ecutwfc=40,
 nbnd=32,
 occupations='fixed',
/
&ELECTRONS
 diagonalization='david',
 mixing_mode='plain',
 mixing_beta=0.5,
 conv_thr=1.0d-10,
/
ATOMIC_SPECIES
Si 28.0855 Si_ONCV_PBE-1.2.upf
C 12.0107 C_ONCV_PBE-1.2.upf
ATOMIC_POSITIONS crystal
Si 0.0 0.0 0.0
Si 0.3333333 0.6666667 0.5
C 0.0 0.0 0.1875
C 0.3333333 0.6666667 0.6875
K_POINTS automatic
6 6 4 0 0 0
"""
qe_out="""Program PWSCF v.6.6 starts
 kinetic-energy cutoff = 40.0000 Ry
 charge density cutoff = 160.0000 Ry
 number of k points= 21
 convergence has been achieved in 9 iterations
! total energy = -38.56493128 Ry
 Total force = 0.000391
 P= -99.41
JOB DONE.
"""
with tempfile.TemporaryDirectory() as td:
    p=Path(td); (p/'sic.scf.in').write_text(qe_in); (p/'sic.scf.out').write_text(qe_out); out=p/'metadata'
    subprocess.check_call([sys.executable,str(Path(__file__).parent/'matsci_dft_extractor.py'),str(p),'-o',str(out)])
    d=json.loads((out/'matsci_dft_metadata.json').read_text())
    assert d['calculation']['task']=='scf'
    assert d['software']['version']=='6.6'
    assert d['method']['basis']['ecutwfc']['requested']['source_value']==40
    assert d['method']['basis']['ecutrho']['effective']['source_value']==160
    assert d['method']['kpoints']['requested']['grid']==[6,6,4]
    assert d['method']['scf']['iterations']==9
    assert d['quality_control']['job_completed'] is True
    print('SELF-TEST PASSED')
