/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
package gplx;
import org.junit.*;
public class Gfo_evt_mgr_tst {
	@Before public void setup() {
		pub = make_(); sub = make_();
	}	MockEvObj pub, sub;
	@Test  public void Basic() {
		Gfo_evt_mgr_.Sub_same(pub, "ev1", sub);
		Gfo_evt_mgr_.Pub_val(pub, "ev1", "val1");			
		sub.tst_Handled("val1");
	}
	@Test  public void None() {// make sure no subscribers does not cause exception
		Gfo_evt_mgr_.Sub_same(pub, "ev1", sub);
		Gfo_evt_mgr_.Pub_val(pub, "ev2", "val1");	//ev2 does not exist
		sub.tst_Handled();
	}
	@Test  public void Lnk() {
		MockEvObj mid = make_();
		mid.Evt_mgr().Lnk(pub);
		Gfo_evt_mgr_.Sub_same(mid, "ev1", sub);
		Gfo_evt_mgr_.Pub_val(pub, "ev1", "val1");
		sub.tst_Handled("val1");
	}
	@Test  public void RlsSub() {
		this.Basic();

		Gfo_evt_mgr_.Rls_sub(sub);
		Gfo_evt_mgr_.Pub_val(pub, "ev1", "val1");
		sub.tst_Handled();
	}
	@Test  public void RlsPub() {
		this.Basic();

		Gfo_evt_mgr_.Rls_sub(pub);
		Gfo_evt_mgr_.Pub_val(pub, "ev1", "val1");
		sub.tst_Handled();
	}
	MockEvObj make_() {return new MockEvObj();}
}
class MockEvObj implements Gfo_evt_itm {
	public Gfo_evt_mgr Evt_mgr() {return eventMgr;} Gfo_evt_mgr eventMgr;
	public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
		handled.Add(m.ReadStr("v"));
		return this;
	}
	List_adp handled = List_adp_.New();
	public void tst_Handled(String... expd) {
		Tfds.Eq_ary_str(expd, handled.To_str_ary());
		handled.Clear();
	}
	public MockEvObj(){eventMgr = new Gfo_evt_mgr(this);}
}
