/**
   * Test method for {@link uk.me.g4dpz.satellite.PassPredictor#nextSatPass(java.util.Date,
   * boolean)}.
   */
  @Test
  public final void testNextSatPassWithWindBack() {

    final TLE tle = new TLE(LEO_TLE);

    Assert.assertTrue(!tle.isDeepspace());

    try {
      final PassPredictor passPredictor = new PassPredictor(tle, GROUND_STATION);
      final DateTime cal = new DateTime(DATE_2009_01_05T04_30_00Z);
      final SatPassTime passTime = passPredictor.nextSatPass(cal.toDate(), true);
      Assert.assertEquals(DATE_2009_01_05T04_28_10_0000, TZ_FORMAT.format(passTime.getStartTime()));
      Assert.assertEquals(DATE_2009_01_05T04_32_15_0000, TZ_FORMAT.format(passTime.getEndTime()));
      Assert.assertEquals(NONE, passTime.getPolePassed());
      Assert.assertEquals(52, passTime.getAosAzimuth());
      Assert.assertEquals(84, passTime.getLosAzimuth());
      Assert.assertEquals(0.9, passTime.getMaxEl(), 0.05);
      Assert.assertEquals(
          Long.valueOf(436802379L),
          passPredictor.getDownlinkFreq(436800000L, passTime.getStartTime()));
      Assert.assertEquals(
          Long.valueOf(145800719L), passPredictor.getUplinkFreq(145800000L, passTime.getEndTime()));
    } catch (final InvalidTleException e) {
      Assert.fail(INVALID_TLE_EXCEPTION_WAS_THROWN);
    } catch (final SatNotFoundException snfe) {
      Assert.fail(SAT_NOT_FOUND_EXCEPTION_WAS_THROWN);
    }
  }
  /** Test method for {@link uk.me.g4dpz.satellite.PassPredictor#nextSatPass(java.util.Date)}. */
  @Test
  public final void testNextSatPass() {

    final TLE tle = new TLE(LEO_TLE);

    Assert.assertTrue(!tle.isDeepspace());

    try {
      final PassPredictor passPredictor = new PassPredictor(tle, GROUND_STATION);
      final DateTime cal = new DateTime("2009-01-05T00:00:00Z");
      SatPassTime passTime = passPredictor.nextSatPass(cal.toDate());
      Assert.assertEquals(DATE_2009_01_05T04_28_10_0000, TZ_FORMAT.format(passTime.getStartTime()));
      Assert.assertEquals(DATE_2009_01_05T04_32_15_0000, TZ_FORMAT.format(passTime.getEndTime()));
      Assert.assertEquals("2009-01-05T04:30:10+0000", TZ_FORMAT.format(passTime.getTCA()));
      Assert.assertEquals(NONE, passTime.getPolePassed());
      Assert.assertEquals(52, passTime.getAosAzimuth());
      Assert.assertEquals(84, passTime.getLosAzimuth());
      Assert.assertEquals("0.9", String.format("%3.1f", passTime.getMaxEl()));
      Assert.assertEquals(
          Long.valueOf(436802379L),
          passPredictor.getDownlinkFreq(436800000L, passTime.getStartTime()));
      Assert.assertEquals(
          Long.valueOf(145800719L), passPredictor.getUplinkFreq(145800000L, passTime.getEndTime()));

      passTime = passPredictor.nextSatPass(passTime.getStartTime());
      Assert.assertEquals("2009-01-05T06:04:00+0000", TZ_FORMAT.format(passTime.getStartTime()));
      Assert.assertEquals("2009-01-05T06:18:00+0000", TZ_FORMAT.format(passTime.getEndTime()));
      Assert.assertEquals(NONE, passTime.getPolePassed());
      Assert.assertEquals(22, passTime.getAosAzimuth());
      Assert.assertEquals(158, passTime.getLosAzimuth());
      Assert.assertEquals(24.42, passTime.getMaxEl(), 0.02);

      passTime = passPredictor.nextSatPass(passTime.getStartTime());
      Assert.assertEquals("2009-01-05T07:42:45+0000", TZ_FORMAT.format(passTime.getStartTime()));
      Assert.assertEquals("2009-01-05T07:57:50+0000", TZ_FORMAT.format(passTime.getEndTime()));
      Assert.assertEquals(NORTH, passTime.getPolePassed());
      Assert.assertEquals(11, passTime.getAosAzimuth());
      Assert.assertEquals(207, passTime.getLosAzimuth());
      Assert.assertEquals("62.19", String.format("%5.2f", passTime.getMaxEl()));

      passTime = passPredictor.nextSatPass(passTime.getStartTime());
      Assert.assertEquals("2009-01-05T09:22:05+0000", TZ_FORMAT.format(passTime.getStartTime()));
      Assert.assertEquals("2009-01-05T09:34:20+0000", TZ_FORMAT.format(passTime.getEndTime()));
      Assert.assertEquals(NORTH, passTime.getPolePassed());
      Assert.assertEquals(4, passTime.getAosAzimuth());
      Assert.assertEquals(256, passTime.getLosAzimuth());
      Assert.assertEquals(14.3, passTime.getMaxEl(), 0.02);

      passTime = passPredictor.nextSatPass(passTime.getStartTime());
      Assert.assertEquals("2009-01-05T11:02:05+0000", TZ_FORMAT.format(passTime.getStartTime()));
      Assert.assertEquals("2009-01-05T11:07:35+0000", TZ_FORMAT.format(passTime.getEndTime()));
      Assert.assertEquals(NONE, passTime.getPolePassed());
      Assert.assertEquals(355, passTime.getAosAzimuth());
      Assert.assertEquals(312, passTime.getLosAzimuth());
      Assert.assertEquals(1.8, passTime.getMaxEl(), 0.05);
    } catch (final InvalidTleException e) {
      Assert.fail(INVALID_TLE_EXCEPTION_WAS_THROWN);
    } catch (final SatNotFoundException snfe) {
      Assert.fail(SAT_NOT_FOUND_EXCEPTION_WAS_THROWN);
    }
  }