public void testSineRoots() {
    {
      // Conjugate +- 1.0i root
      ComplexNumber[] roots =
          new ComplexNumber[] {new ComplexNumber(0.0, 1.0), new ComplexNumber(0.0, -1.0)};

      SolutionBasis basis = new SolutionBasis(roots);
      Set<EquationComponent> solutionComponents = basis.getSolutionComponents();

      EquationComponent component1 =
          new EquationComponent(
              Polynomial.getSingularPolynomial(),
              Exponential.getSingularExponential(),
              new SineAndCosine(
                  1.0, Polynomial.getSingularPolynomial(), Polynomial.getSingularPolynomial()));

      assertTrue(solutionComponents.contains(component1));
    }

    {
      // Double Conjugate +- 1.0i root
      ComplexNumber[] roots =
          new ComplexNumber[] {
            new ComplexNumber(0.0, 1.0),
            new ComplexNumber(0.0, -1.0),
            new ComplexNumber(0.0, 1.0),
            new ComplexNumber(0.0, -1.0)
          };

      SolutionBasis basis = new SolutionBasis(roots);
      Set<EquationComponent> solutionComponents = basis.getSolutionComponents();

      EquationComponent component1 =
          new EquationComponent(
              Polynomial.getSingularPolynomial(),
              Exponential.getSingularExponential(),
              new SineAndCosine(
                  1.0, Polynomial.getSingularPolynomial(), Polynomial.getSingularPolynomial()));

      EquationComponent component2 =
          new EquationComponent(
              new Polynomial(new Double[] {1.0, 0.0}),
              Exponential.getSingularExponential(),
              new SineAndCosine(
                  1.0, Polynomial.getSingularPolynomial(), Polynomial.getSingularPolynomial()));

      assertTrue(solutionComponents.contains(component1));
      assertTrue(solutionComponents.contains(component2));
    }
  }
  @Test
  public void testSimpleRoots() {
    {
      ComplexNumber[] roots = new ComplexNumber[] {new ComplexNumber(0.0, 0.0)};

      SolutionBasis basis = new SolutionBasis(roots);
      Set<EquationComponent> solutionComponents = basis.getSolutionComponents();

      EquationComponent component =
          new EquationComponent(
              Polynomial.getSingularPolynomial(),
              Exponential.getSingularExponential(),
              SineAndCosine.getSingularSineAndCosine());

      boolean isInSet = solutionComponents.contains(component);

      assertTrue(isInSet);
    }

    {
      // Double 0.0 root
      ComplexNumber[] roots =
          new ComplexNumber[] {new ComplexNumber(0.0, 0.0), new ComplexNumber(0.0, 0.0)};

      SolutionBasis basis = new SolutionBasis(roots);
      Set<EquationComponent> solutionComponents = basis.getSolutionComponents();

      EquationComponent component1 =
          new EquationComponent(
              Polynomial.getSingularPolynomial(),
              Exponential.getSingularExponential(),
              SineAndCosine.getSingularSineAndCosine());

      EquationComponent component2 =
          new EquationComponent(
              new Polynomial(new Double[] {1.0, 0.0}),
              Exponential.getSingularExponential(),
              SineAndCosine.getSingularSineAndCosine());

      assertTrue(solutionComponents.contains(component1));
      assertTrue(solutionComponents.contains(component2));
    }

    {
      // Triple 0.0 root
      ComplexNumber[] roots =
          new ComplexNumber[] {
            new ComplexNumber(0.0, 0.0), new ComplexNumber(0.0, 0.0), new ComplexNumber(0.0, 0.0)
          };

      SolutionBasis basis = new SolutionBasis(roots);
      Set<EquationComponent> solutionComponents = basis.getSolutionComponents();

      EquationComponent component1 =
          new EquationComponent(
              Polynomial.getSingularPolynomial(),
              Exponential.getSingularExponential(),
              SineAndCosine.getSingularSineAndCosine());

      EquationComponent component2 =
          new EquationComponent(
              new Polynomial(new Double[] {1.0, 0.0}),
              Exponential.getSingularExponential(),
              SineAndCosine.getSingularSineAndCosine());

      EquationComponent component3 =
          new EquationComponent(
              new Polynomial(new Double[] {1.0, 0.0, 0.0}),
              Exponential.getSingularExponential(),
              SineAndCosine.getSingularSineAndCosine());

      assertTrue(solutionComponents.contains(component1));
      assertTrue(solutionComponents.contains(component2));
      assertTrue(solutionComponents.contains(component3));
    }
  }