# -*- coding: utf-8 -*-
"""
Created on Wed Sep 30 21:59:52 2020

@author: Daniel Powell
"""

import numpy as np
from matplotlib import pyplot as plt
import subprocess


def test_scheme_orders():
    N = 3
    dt = np.logspace(-N, -1, num=N)
    # euler, euler-pc, rk4
    v = np.zeros((3, N))
    
    scheme = ['a', 'b', 'c']
    
    for i, letter in enumerate(scheme):
        for j in range(N):
            ps = subprocess.Popen("D:\\code\\hertzian.exe", stdin=subprocess.PIPE,
                                  stdout=subprocess.PIPE, universal_newlines=True)
            ps.stdin.write('y')
            ps.stdin.write(letter)
            out, err = ps.communicate(str(dt[j]))
    
            a = np.fromstring(out[-41:], dtype=float, count=2, sep=', ')
            v[i, j] = a[0]

    exact = np.exp(-1)
    
    error = np.abs(exact - v)
    
    order = (np.log10(error[:, -1]) - np.log10(error[:, 0])) / (np.log10(dt[-1]) -
                                                                np.log10(dt[0]))

    # check that the order of the method is roughly correct
    assert np.abs(order[0] - 1) < 0.3
    assert np.abs(order[1] - 2) < 0.3
    assert np.abs(order[2] - 4) < 0.3
    
    
    
# =============================================================================
#     plt.figure()
#     plt.loglog(dt, error[0, :], label='Euler')
#     plt.loglog(dt, error[1, :], label='Euler PC')
#     plt.loglog(dt, error[2, :], label='RK4')
#     plt.xlabel(r"$\Delta t$ (s)")
#     plt.ylabel("Error")
#     plt.legend()
#     plt.tight_layout()
# =============================================================================
