【问题标题】:Adding polynomials添加多项式
【发布时间】:2012-11-06 05:40:09
【问题描述】:

我需要一些帮助。我正在做测试驱动的开发。这些是测试:

@Test public void add01() throws TError { assertEquals(new Term(10,5),  new Term(4,5).add(new Term(6,5))); }
@Test public void add02() throws TError { assertEquals(new Term(6,5),   new Term(0,5).add(new Term(6,5))); }
@Test public void add03() throws TError { assertEquals(new Term(2,5),   new Term(-4,5).add(new Term(6,5))); }
@Test public void add04() throws TError { assertEquals(new Term(10,0),  new Term(4,0).add(new Term(6,0))); }
@Test public void add05() throws TError { assertEquals(new Term(4,5),   new Term(4,5).add(new Term(0,5))); }
@Test public void add06() throws TError { assertEquals(new Term(-2,5),  new Term(4,5).add(new Term(-6,5))); }

@Test (expected = IncompatibleTerms.class)
public void add07() throws TError { t = new Term(4,5).add(new Term(6,0)); }

@Test (expected = CoefficientOverflow.class)
public void add08() throws TError { t = new Term(min,4).add(new Term(-1,4)); }

@Test public void add09() throws TError { assertEquals(new Term(min,4), new Term(min+1,4).add(new Term(-1,4))); }
@Test public void add10() throws TError { assertEquals(new Term(-11,4), new Term(-10,4).add(new Term(-1,4))); }
@Test public void add11() throws TError { assertEquals(new Term(-2,4),  new Term(-1,4).add(new Term(-1,4))); }
@Test public void add12() throws TError { assertEquals(new Term(-1,4),  new Term(0,4).add(new Term(-1,4))); }
@Test public void add13() throws TError { assertEquals(Term.Zero,       new Term(1,4).add(new Term(-1,4))); }
@Test public void add14() throws TError { assertEquals(new Term(9,4),   new Term(10,4).add(new Term(-1,4))); }
@Test public void add15() throws TError { assertEquals(new Term(max,4), new Term(max-1,4).add(new Term(1,4))); }

@Test (expected = CoefficientOverflow.class)
public void add16() throws TError { t = new Term(max,4).add(new Term(1,4)); }

//Using domain-specific knowledge:  addition should be commutative

@Test public void add17() throws TError { assertEquals(new Term(-1,2).add(new Term(1,2)),       new Term(1,2).add(new Term(-1,2))); }
@Test public void add18() throws TError { assertEquals(new Term(min+1,2).add(new Term(-1,2)),   new Term(-1,2).add(new Term(min+1,2))); }
@Test public void add19() throws TError { assertEquals(new Term(min,2).add(Term.Zero),      Term.Zero.add(new Term(min,2))); }
@Test public void add20() throws TError { assertEquals(new Term(min,0).add(Term.Unit),      Term.Unit.add(new Term(min,0))); }
@Test public void add21() throws TError { assertEquals(new Term(max,0).add(Term.Zero),      Term.Zero.add(new Term(max,0))); }
@Test public void add22() throws TError { assertEquals(new Term(max-1,2).add(new Term(1,2)),    new Term(1,2).add(new Term(max-1,2))); }
@Test public void add23() throws TError { assertEquals(new Term(max,2).add(new Term(min,2)),    new Term(min,2).add(new Term(max,2))); }

这是我迄今为止在“Andrej Gajduk”的帮助下的添加方法。

public Term add(Term that) throws CoefficientOverflow, IncompatibleTerms {
    if (this.expo != that.expo) throw new IncompatibleTerms();
    return new Term (this.coef + that.coef,expo);
}

这些是失败的测试 = 2、5、8、12、16、19、21。但我对测试 17-23 有疑问;我知道他们中的一些人通过了,但我认为他们不应该,因为这就像 x + y = y + x,但我不知道如何实现它。

我需要有关此测试失败原因的一些帮助/指导。

对于测试 8 和 16,我尝试了以下代码。它完成了这项工作,但随后在其他测试中产生了更多错误。那么所有的失败都变成了 2, 5, 8, 12, 16, 19, 21 + 20, 23(两个额外的失败)

if (this.coef == Integer.MIN_VALUE || that.coef == Integer.MIN_VALUE) throw new CoefficientOverflow();
if (this.coef == Integer.MAX_VALUE || that.coef == Integer.MAX_VALUE) throw new CoefficientOverflow();

【问题讨论】:

  • 你能发布你的Term.equals()方法吗?
  • 这不是测试驱动的开发。
  • 是不是测试驱动开发?

标签: java unit-testing junit tdd polynomial-math


【解决方案1】:

此链接显示了检测溢出的另一种方法:http://mindprod.com/jgloss/gotchas.html#OVERFLOW

我认为这是因为当 coef 为 0 或整个语句被假定为零时,因此您需要检查这一点并使用零的替代项

if(this.coef ==0)
{//return Term t = new Term(that.coef, that.expo);}

else
{//return Term t = new Term(this.coef, this.expo);}
}

希望对你有帮助

【讨论】:

    【解决方案2】:

    您的equals 方法不正确。请更新如下:

    @Override
    public boolean equals(Object that) {
        if (that == null) {
            return false;
        }else if (this.getClass() != that.getClass()) {
            return false;
        }else if (this == that) {
            return true;
        }else{
            Term term = (Term) that;
            if ((term.coef) == (this.coef) && (term.expo) == (this.expo)) {
                return true;
            }
        }
        return false;
    }
    

    为了让你通过大部分测试用例,更新add方法如下:

    public Term add(Term that) throws IncompatibleTerms, CoefficientOverflow{
        //handle addition with term zero
            if(this.equals(Term.Zero)){
            return that;
        }else if(Term.Zero.equals(that)){
            return this;
        }
    
        if (this.expo != that.expo) throw new IncompatibleTerms();
        if((this.coef>= 0 && that.coef >= 0 && this.coef + that.coef <0) ||
                (this.coef<= 0 && that.coef <= 0 && this.coef + that.coef >0)){
                             throw new CoefficientOverflow();
            }    
        return new Term (this.coef + that.coef,expo);
    }
    

    【讨论】:

    • @Lax:我在答案中做了一些更新。如果这没有帮助,请检查并告诉我。
    • 感谢您的帮助,它确实通过了大多数测试,除了上午 7,8 和 16 点试图找出 y 7 失败,因为不同指数的条件是正确的
    • @Lax:对我来说,所有的测试用例都通过了。你有什么特殊的构造方法吗?
    • public Term(int c, int e) throws NegativeExponent { if (e }
    • @Lax:我使用了相同的,所有测试用例都通过了。只是检查一下,您是否使用答案中更新的equals 方法。有一个问题,我在某个时候更新了。
    猜你喜欢
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多