def test_paramprompt_eof(caplog): """What happens when we end early?""" s = Session() s._add_model_types(sherpa.models.basic) cpt1 = s.create_model_component('const1d', 'bob') cpt2 = s.create_model_component('gauss1d', 'fred') s.paramprompt(True) assert len(caplog.records) == 0 with pytest.raises(EOFError): with SherpaVerbosity('INFO'): with patch("sys.stdin", StringIO("\n5,1,5\n2\n")): s.set_source(bob + fred) assert len(caplog.records) == 0 assert cpt1.c0.val == pytest.approx(1) assert cpt1.c0.min < -3e38 assert cpt1.c0.max > 3e38 assert cpt2.fwhm.val == pytest.approx(5) assert cpt2.fwhm.min == pytest.approx(1) assert cpt2.fwhm.max == pytest.approx(5) assert cpt2.pos.val == pytest.approx(2) assert cpt2.pos.min < -3e38 assert cpt2.pos.max > 3e38 assert cpt2.ampl.val == pytest.approx(1) assert cpt2.ampl.min < -3e38 assert cpt2.ampl.max > 3e38
def test_paramprompt_single_parameter_check_invalid_max_out_of_bound(caplog): """Note this creates two warnings""" s = Session() s._add_model_types(sherpa.models.basic) s.paramprompt(True) assert len(caplog.records) == 0 with SherpaVerbosity('INFO'): with patch("sys.stdin", StringIO(",,typo\n,,-200")): s.set_source("scale1d.bob") assert len(caplog.records) == 2 lname, lvl, msg = caplog.record_tuples[0] assert lname == "sherpa.ui.utils" assert lvl == logging.INFO assert msg == "Please provide a float value; could not convert string to float: 'typo'" lname, lvl, msg = caplog.record_tuples[1] assert lname == "sherpa.models.parameter" assert lvl == logging.WARN assert msg == "parameter bob.c0 greater than new maximum; bob.c0 reset to -200" mdl = s.get_model_component('bob') assert mdl.c0.val == pytest.approx(-200) assert mdl.c0.min < -3e38 assert mdl.c0.max == pytest.approx(-200)
def test_paramprompt_multi_parameter(caplog): """Check that paramprompt works with multiple parameters""" s = Session() s._add_model_types(sherpa.models.basic) cpt1 = s.create_model_component('const1d', 'bob') cpt2 = s.create_model_component('gauss1d', 'fred') s.paramprompt(True) assert len(caplog.records) == 0 with SherpaVerbosity('INFO'): with patch("sys.stdin", StringIO("\n5,1,5\n\n-5, -5, 0")): s.set_source(bob + fred) assert len(caplog.records) == 0 assert cpt1.c0.val == pytest.approx(1) assert cpt1.c0.min < -3e38 assert cpt1.c0.max > 3e38 assert cpt2.fwhm.val == pytest.approx(5) assert cpt2.fwhm.min == pytest.approx(1) assert cpt2.fwhm.max == pytest.approx(5) assert cpt2.pos.val == pytest.approx(0) assert cpt2.pos.min < -3e38 assert cpt2.pos.max > 3e38 assert cpt2.ampl.val == pytest.approx(-5) assert cpt2.ampl.min == pytest.approx(-5) assert cpt2.ampl.max == pytest.approx(0)
def test_paramprompt_set_false(flag): """The default setting is False.""" s = Session() s._paramprompt = True s.paramprompt(flag) assert not s._paramprompt
def test_paramprompt_single_parameter_check_too_many_commas(caplog): """Check we tell users there was a problem""" s = Session() s._add_model_types(sherpa.models.basic) s.paramprompt(True) assert len(caplog.records) == 0 with SherpaVerbosity('INFO'): with patch("sys.stdin", StringIO(",,,,\n12")): s.set_source("scale1d.bob") assert len(caplog.records) == 1 lname, lvl, msg = caplog.record_tuples[0] assert lname == "sherpa.ui.utils" assert lvl == logging.INFO assert msg == "Error: Please provide a comma-separated list of floats; e.g. val,min,max" mdl = s.get_model_component('bob') assert mdl.c0.val == pytest.approx(12) assert mdl.c0.min < -3e38 assert mdl.c0.max > 3e38 # remove the bob symbol from the global table s.clean()
def test_paramprompt_single_parameter_check_invalid_max(caplog): s = Session() s._add_model_types(sherpa.models.basic) s.paramprompt(True) assert len(caplog.records) == 0 with SherpaVerbosity('INFO'): with patch("sys.stdin", StringIO("-2,,typo\n-200,,-2")): s.set_source("scale1d.bob") assert len(caplog.records) == 1 lname, lvl, msg = caplog.record_tuples[0] assert lname == "sherpa.ui.utils" assert lvl == logging.INFO assert msg == "Please provide a float value; could not convert string to float: 'typo'" mdl = s.get_model_component('bob') assert mdl.c0.val == pytest.approx(-200) assert mdl.c0.min < -3e38 assert mdl.c0.max == pytest.approx(-2) # remove the bob symbol from the global table s.clean()
def test_paramprompt_function(): """Does paramprompt toggle the state setting?""" s = Session() assert not s._paramprompt s.paramprompt(True) assert s._paramprompt s.paramprompt(False) assert not s._paramprompt
def test_paramprompt_function(): """Does paramprompt toggle the state setting?""" s = Session() assert not s._paramprompt s.paramprompt(True) assert s._paramprompt s.paramprompt(False) assert not s._paramprompt
def test_paramprompt_single_parameter_combo_works(caplog): s = Session() s._add_model_types(sherpa.models.basic) s.paramprompt(True) assert len(caplog.records) == 0 with SherpaVerbosity('INFO'): with patch("sys.stdin", StringIO("-2,-10,10")): s.set_source("scale1d.bob") assert len(caplog.records) == 0 mdl = s.get_model_component('bob') assert mdl.c0.val == pytest.approx(-2) assert mdl.c0.min == pytest.approx(-10) assert mdl.c0.max == pytest.approx(10)
def test_paramprompt_single_parameter_max_works(caplog): s = Session() s._add_model_types(sherpa.models.basic) s.paramprompt(True) assert len(caplog.records) == 0 with SherpaVerbosity('INFO'): with patch("sys.stdin", StringIO(",,100")): s.set_source("scale1d.bob") assert len(caplog.records) == 0 mdl = s.get_model_component('bob') assert mdl.c0.val == pytest.approx(1) assert mdl.c0.min < -3e38 assert mdl.c0.max == pytest.approx(100) # remove the bob symbol from the global table s.clean()
def test_paramprompt(): """Does paramprompt work?""" s = Session() assert s.list_model_ids() == [] assert s.list_model_components() == [] # Add in some models s._add_model_types(sherpa.models.basic) models = s.list_models() assert models != [] assert 'const1d' in models s.create_model_component('const1d', 'm1') assert s.list_model_ids() == [] expected = ['m1'] assert s.list_model_components() == expected # Now there are multiple components do not rely on any ordering # provided by list_model_components() # s.paramprompt(True) # paramprompt doesn't affect create_model_component (as shown # by the fact that we don't have to mock stdin) # s.create_model_component('const1d', 'm2') assert s.list_model_ids() == [] expected = set(expected) expected.add('m2') assert set(s.list_model_components()) == expected # it does affect set_model # # pytest errors out if you try to read from stdin in a test, so # try to work around this here using # https://stackoverflow.com/questions/13238566/python-equivalent-of-input-using-sys-stdin # An alternative would be just to check that the error is # raised, and the text, but then we don't get to test the # behaviour of the paramprompt code. # with patch("sys.stdin", StringIO(u"2.1")): s.set_model('const1d.mx') assert s.list_model_ids() == [1] expected.add('mx') assert set(s.list_model_components()) == expected mx = s.get_model_component('mx') assert mx.c0.val == pytest.approx(2.1) with patch("sys.stdin", StringIO(u"2.1e-3 , 2.0e-3, 1.2e-2")): s.set_model('x', 'const1d.my') assert set(s.list_model_ids()) == set([1, 'x']) expected.add('my') assert set(s.list_model_components()) == expected my = s.get_model_component('my') assert my.c0.val == pytest.approx(2.1e-3) assert my.c0.min == pytest.approx(2.0e-3) assert my.c0.max == pytest.approx(1.2e-2) with patch("sys.stdin", StringIO(u"2.1e-3 ,, 1.2e-2")): s.set_model(2, 'const1d.mz') assert set(s.list_model_ids()) == set([1, 2, 'x']) expected.add('mz') assert set(s.list_model_components()) == expected mz = s.get_model_component('mz') assert mz.c0.val == pytest.approx(2.1e-3) assert mz.c0.min == pytest.approx(- parameter.hugeval) assert mz.c0.max == pytest.approx(1.2e-2) with patch("sys.stdin", StringIO(u"-12.1,-12.1")): s.set_model('const1d.f1') assert set(s.list_model_ids()) == set([1, 2, 'x']) expected.add('f1') assert set(s.list_model_components()) == expected f1 = s.get_model_component('f1') assert f1.c0.val == pytest.approx(-12.1) assert f1.c0.min == pytest.approx(-12.1) assert f1.c0.max == pytest.approx(parameter.hugeval) with patch("sys.stdin", StringIO(u" ,-12.1")): s.set_model('const1d.f2') # stop checking list_model_ids expected.add('f2') assert set(s.list_model_components()) == expected f2 = s.get_model_component('f2') assert f2.c0.val == pytest.approx(1.0) assert f2.c0.min == pytest.approx(-12.1) assert f2.c0.max == pytest.approx(parameter.hugeval) with patch("sys.stdin", StringIO(u" ,")): s.set_model('const1d.f3') f3 = s.get_model_component('f3') assert f3.c0.val == pytest.approx(1.0) assert f3.c0.min == pytest.approx(- parameter.hugeval) assert f3.c0.max == pytest.approx(parameter.hugeval) with patch("sys.stdin", StringIO(u" ,, ")): s.set_model('const1d.f4') f4 = s.get_model_component('f4') assert f4.c0.val == pytest.approx(1.0) assert f4.c0.min == pytest.approx(- parameter.hugeval) assert f4.c0.max == pytest.approx(parameter.hugeval)
def test_paramprompt(): """Does paramprompt work?""" s = Session() assert s.list_model_ids() == [] assert s.list_model_components() == [] # Add in some models import sherpa.models.basic s._add_model_types(sherpa.models.basic) assert s.list_models() != [] s.create_model_component('const1d', 'm1') assert s.list_model_ids() == [] expected = ['m1'] assert s.list_model_components() == expected # Now there are multiple components do not rely on any ordering # provided by list_model_components() # s.paramprompt(True) # paramprompt doesn't affect create_model_component (as shown # by the fact that we don't have to mock stdin) # s.create_model_component('const1d', 'm2') assert s.list_model_ids() == [] expected = set(expected) expected.add('m2') assert set(s.list_model_components()) == expected # it does affect set_model # # pytest errors out if you try to read from stdin in a test, so # try to work around this here using # https://stackoverflow.com/questions/13238566/python-equivalent-of-input-using-sys-stdin # An alternative would be just to check that the error is # raised, and the text, but then we don't get to test the # behaviour of the paramprompt code. # with patch("sys.stdin", StringIO(u"2.1")): s.set_model('const1d.mx') assert s.list_model_ids() == [1] expected.add('mx') assert set(s.list_model_components()) == expected mx = s.get_model_component('mx') assert mx.c0.val == pytest.approx(2.1) with patch("sys.stdin", StringIO(u"2.1e-3 , 2.0e-3, 1.2e-2")): s.set_model('x', 'const1d.my') assert set(s.list_model_ids()) == set([1, 'x']) expected.add('my') assert set(s.list_model_components()) == expected my = s.get_model_component('my') assert my.c0.val == pytest.approx(2.1e-3) assert my.c0.min == pytest.approx(2.0e-3) assert my.c0.max == pytest.approx(1.2e-2) with patch("sys.stdin", StringIO(u"2.1e-3 ,, 1.2e-2")): s.set_model(2, 'const1d.mz') assert set(s.list_model_ids()) == set([1, 2, 'x']) expected.add('mz') assert set(s.list_model_components()) == expected mz = s.get_model_component('mz') assert mz.c0.val == pytest.approx(2.1e-3) assert mz.c0.min == pytest.approx(- parameter.hugeval) assert mz.c0.max == pytest.approx(1.2e-2) with patch("sys.stdin", StringIO(u"-12.1,-12.1")): s.set_model('const1d.f1') assert set(s.list_model_ids()) == set([1, 2, 'x']) expected.add('f1') assert set(s.list_model_components()) == expected f1 = s.get_model_component('f1') assert f1.c0.val == pytest.approx(-12.1) assert f1.c0.min == pytest.approx(-12.1) assert f1.c0.max == pytest.approx(parameter.hugeval) with patch("sys.stdin", StringIO(u" ,-12.1")): s.set_model('const1d.f2') # stop checking list_model_ids expected.add('f2') assert set(s.list_model_components()) == expected f2 = s.get_model_component('f2') assert f2.c0.val == pytest.approx(1.0) assert f2.c0.min == pytest.approx(-12.1) assert f2.c0.max == pytest.approx(parameter.hugeval) with patch("sys.stdin", StringIO(u" ,")): s.set_model('const1d.f3') f3 = s.get_model_component('f3') assert f3.c0.val == pytest.approx(1.0) assert f3.c0.min == pytest.approx(- parameter.hugeval) assert f3.c0.max == pytest.approx(parameter.hugeval) with patch("sys.stdin", StringIO(u" ,, ")): s.set_model('const1d.f4') f4 = s.get_model_component('f4') assert f4.c0.val == pytest.approx(1.0) assert f4.c0.min == pytest.approx(- parameter.hugeval) assert f4.c0.max == pytest.approx(parameter.hugeval)