ProgramGene extends AbstractTreeGene<Op<A>, ProgramGene<A>> implements Gene<Op<A>, ProgramGene<A>>, Function<A[], A> { @Override public A apply(final A[] args) { checkTreeState(); return Program.eval(this, args); } ProgramGene(
		final Op<A> op,
		final int childOffset,
		final ISeq<? extends Op<A>> operations,
		final ISeq<? extends Op<A>> terminals
	); @Override A apply(final A[] args); @SafeVarargs final A eval(final A... args); ISeq<Op<A>> operations(); ISeq<Op<A>> terminals(); TreeNode<Op<A>> toTreeNode(); @Override ProgramGene<A> newInstance(); @Override ProgramGene<A> newInstance(final Op<A> op); @Override ProgramGene<A> newInstance(
		final Op<A> op,
		final int childOffset,
		final int childCount
	);  }
@Test(dataProvider = "methods") public void methodResults(final Function<Tree<?, ?>, Object> method) { final Iterator<? extends Tree<?, ?>> it1 = PROG.iterator(); final Iterator<? extends Tree<?, ?>> it2 = TREE.iterator(); while (it1.hasNext()) { final Tree<?, ?> node1 = it1.next(); final Tree<?, ?> node2 = it2.next(); Assert.assertEquals(method.apply(node1), method.apply(node2)); } }