package sklep.gui;

import static org.mockito.Mockito.*;

import javax.swing.JButton;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.JTextPane;

import sklep.logika.Sklep;
import junit.extensions.jfcunit.JFCTestCase;
import junit.extensions.jfcunit.JFCTestHelper;
import junit.extensions.jfcunit.finder.FrameFinder;
import junit.extensions.jfcunit.finder.NamedComponentFinder;

public class TestOkno extends JFCTestCase {
	private static final String PRALKA = "Pralka";
	private static final String OPIS_PRALKI = "Opis pralki";
	private static final String POTWIERDZENIE = "Potwierdzenie zakupu";

	private Okno okno;
	private Sklep m_sklep;

	protected void setUp() throws Exception {
		super.setUp();
		setHelper(new JFCTestHelper());
		
		m_sklep = mock(Sklep.class);
		when(m_sklep.opisTowaru(PRALKA)).thenReturn(OPIS_PRALKI);
		when(m_sklep.zakup(PRALKA, 3)).thenReturn(POTWIERDZENIE);
		
		okno = new Okno(m_sklep);
		okno.setVisible(true);
	}

	protected void tearDown() throws Exception {
		okno.close();
		getHelper().cleanUp(this);
		super.tearDown();
	}

	public void testJestOkno() {
		FrameFinder ff = new FrameFinder("Sklep");
		ff.setWait(1);
		assertNotNull(ff.find());
	}

	public void testJestPrzycisk() {
		NamedComponentFinder f = new NamedComponentFinder(JButton.class, "button");
		
		f.setWait(1);
		JButton button = (JButton) f.find();
		assertNotNull(button);
	}

	public void testRadioButton() {
		NamedComponentFinder f = new NamedComponentFinder(JRadioButton.class, "rdbtnKup");
		f.setWait(1);
		JRadioButton radioKup = (JRadioButton)f.find();
		assertNotNull(radioKup);

		radioKup.doClick();
		
		f.setComponentClass(JTextField.class);
		f.setName("textField_Liczba");
		JTextField textFieldLiczba = (JTextField)f.find();
		assertNotNull(textFieldLiczba);
		assertEquals(true, textFieldLiczba.isEnabled());
		
		f.setComponentClass(JButton.class);
		f.setName("button");
		JButton button = (JButton)f.find();
		assertNotNull(button);
		assertEquals("Kup", button.getText());
	}

	public void testRadioButtonLewy() {
		NamedComponentFinder f = new NamedComponentFinder(JRadioButton.class, "rdbtnWywietlOpis");
		f.setWait(1);
		JRadioButton radioOpis = (JRadioButton)f.find();
		assertNotNull(radioOpis);
		radioOpis.setSelected(false);

		f.setName("rdbtnKup");
		JRadioButton radioZakup = (JRadioButton)f.find();
		assertNotNull(radioZakup);
		radioZakup.setSelected(true);

		f.setComponentClass(JTextField.class);
		f.setName("textField_Liczba");
		JTextField textFieldLiczba = (JTextField)f.find();
		assertNotNull(textFieldLiczba);
		textFieldLiczba.setEnabled(true);
		
		f.setComponentClass(JButton.class);
		f.setName("button");
		JButton button = (JButton)f.find();
		assertNotNull(button);
		button.setText("Kup");
		
		radioOpis.doClick();
		
		assertEquals(false, textFieldLiczba.isEnabled());
		assertEquals("Pobierz", button.getText());
		
	}
	
	public void testOpis() {
		NamedComponentFinder f = new NamedComponentFinder(JRadioButton.class, "rdbtnWywietlOpis");
		f.setWait(1);
		JRadioButton radioOpis = (JRadioButton)f.find();
		assertNotNull(radioOpis);
		
		// nie jest konieczne
		radioOpis.setSelected(true);

		f.setComponentClass(JTextField.class);
		f.setName("textField_Nazwa");
		JTextField textFieldNazwa = (JTextField)f.find();

		assertNotNull(textFieldNazwa);
		textFieldNazwa.setText(PRALKA);

		f.setComponentClass(JButton.class);
		f.setName("button");
		JButton button = (JButton)f.find();
		assertNotNull(button);
		
		button.doClick();

		f.setComponentClass(JTextPane.class);
		f.setName("textPane");
		JTextPane textPane = (JTextPane)f.find();
		assertNotNull(textPane);
		assertEquals(OPIS_PRALKI, textPane.getText());
	}
	
	public void testZakup() {
		NamedComponentFinder f = new NamedComponentFinder(JRadioButton.class, "rdbtnWywietlOpis");
		f.setWait(1);
		JRadioButton radioOpis = (JRadioButton)f.find();
		assertNotNull(radioOpis);
		radioOpis.setSelected(false);

		f.setName("rdbtnKup");
		JRadioButton radioZakup = (JRadioButton)f.find();
		assertNotNull(radioZakup);
		radioZakup.setSelected(true);

		f.setComponentClass(JTextField.class);
		f.setName("textField_Liczba");
		JTextField textFieldLiczba = (JTextField)f.find();
		assertNotNull(textFieldLiczba);
		textFieldLiczba.setEnabled(true);
		
		f.setComponentClass(JButton.class);
		f.setName("button");
		JButton button = (JButton)f.find();
		assertNotNull(button);
		//button.setText("Kup");
		
		f.setComponentClass(JTextField.class);
		f.setName("textField_Nazwa");
		JTextField textFieldNazwa = (JTextField)f.find();

		textFieldNazwa.setText(PRALKA);
		textFieldLiczba.setText("3");

		button.doClick();
		
		f.setComponentClass(JTextPane.class);
		f.setName("textPane");
		JTextPane textPane = (JTextPane)f.find();
		assertNotNull(textPane);
		assertEquals(POTWIERDZENIE, textPane.getText());
		
		// verify dla nadgorliwych, ale tak naprawde nie trzeba
		verify(m_sklep).zakup(PRALKA, 3);
		
		// żeby się upewnić, że okno niechcący nie wykonało innej akcji na warstwie logiki
		verifyNoMoreInteractions(m_sklep);
	}
	
	public void testZakupFormat() {
		NamedComponentFinder f = new NamedComponentFinder(JRadioButton.class, "rdbtnWywietlOpis");
		f.setWait(1);
		JRadioButton radioOpis = (JRadioButton)f.find();
		assertNotNull(radioOpis);
		radioOpis.setSelected(false);

		f.setName("rdbtnKup");
		JRadioButton radioZakup = (JRadioButton)f.find();
		assertNotNull(radioZakup);
		radioZakup.setSelected(true);

		f.setComponentClass(JTextField.class);
		f.setName("textField_Liczba");
		JTextField textFieldLiczba = (JTextField)f.find();
		assertNotNull(textFieldLiczba);
		textFieldLiczba.setEnabled(true);
		
		f.setComponentClass(JButton.class);
		f.setName("button");
		JButton button = (JButton)f.find();
		assertNotNull(button);
		button.setText("Kup");
		
		f.setComponentClass(JTextField.class);
		f.setName("textField_Nazwa");
		JTextField textFieldNazwa = (JTextField)f.find();

		textFieldNazwa.setText(PRALKA);
		textFieldLiczba.setText("nie liczba");

		button.doClick();
		
		f.setComponentClass(JTextPane.class);
		f.setName("textPane");
		JTextPane textPane = (JTextPane)f.find();
		assertNotNull(textPane);
		assertEquals("Błędny format", textPane.getText());
		verify(m_sklep, never()).zakup(anyString(), anyInt());
	}
}
