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_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_add_user_pars_modelname_not_a_model2(): """Use an actual model, but not a user model""" s = Session() s._add_model_types(sherpa.models.basic) s.create_model_component('scale1d', 'foo') with pytest.raises(ArgumentTypeErr) as exc: s.add_user_pars('foo', ['x']) assert str(exc.value) == "'foo' must be a user model"
def test_delete_model_component_invalid_argument(): """We could allow the component to be deleted this way""" s = Session() s._add_model_types(sherpa.models.basic) tst = s.create_model_component('gauss1d', 'gmdl') with pytest.raises(ArgumentTypeErr, match="'name' must be a string"): s.delete_model_component(tst)
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)