测试返回三角形类型的函数

Pan*_*rei 0 c c++ testing integration-testing

作为筛选面试的一部分,我得到了以下问题:

编写一个函数,接收三角形边长的三个整数输入,并返回四个值之一,以确定三角形类型(1 =斜角,2 =等腰,3 =等边,4 =误差).假设另一个开发人员编写了该函数,为该函数生成测试用例.

我的回答是:

#define ERROR 4
#define EQUILATERAL 3
#define ISOSCELES 2
#define SCALENE 1

int detemineTriangle(int x, int y, int z)
{
    if((x<=0) || (y<=0) || (z<=0))
        return ERROR;

    if((x==y) || (x==z) || (y==z))
    {
        if((x==y) && (y==z))
            return EQUILATERAL;
        else
            return ISOSCELES;
    }

    return SCALENE;
}
Run Code Online (Sandbox Code Playgroud)

测试用例:

detemineTriangle (0,0,0);   //error
detemineTriangle (2,2,2);   //equilateral
detemineTriangle (3,3,1);   //isosceles
detemineTriangle (1,3,3);   //isosceles
detemineTriangle (3,1,3);   //isosceles
detemineTriangle (1,2,3);   //scalene
detemineTriangle (-1,2,3);  //error  scalene
detemineTriangle (1,-2,3);  //error  scalene
detemineTriangle (1,2,-3);  //error  scalene
detemineTriangle (-2,-2,-2);   //error equilateral
detemineTriangle (-2,5,-2);   //error isosceles
detemineTriangle (-2,-2,5);   //error isosceles
detemineTriangle (5,-2,-2);   //error isosceles


//looking for overflows/underflows
detemineTriangle (INT_MAX,INT_MAX,INT_MAX);
detemineTriangle (INT_MAX,1,1);
detemineTriangle (1,INT_MAX,1);
detemineTriangle (1,1,INT_MAX);
detemineTriangle (-INT_MAX,-INT_MAX,-INT_MAX);
detemineTriangle (-INT_MAX,1,1);
detemineTriangle (1,-INT_MAX,1);
detemineTriangle (1,1,-INT_MAX);

//boundary tests
detemineTriangle(1,1,1)
detemineTriangle(0,0,0)
detemineTriangle(-1,-1,-1)


detemineTriangle (0,10,10);   
detemineTriangle (1,10,10);   
detemineTriangle (-1,10,10); 

detemineTriangle (10,0,10);   
detemineTriangle (10,1,10);   
detemineTriangle (10,-1,10); 

detemineTriangle (10,10,0);   
detemineTriangle (10,10,1);   
detemineTriangle (10,10,-1);   

//checking thread safety
a =detemineTriangle (10,10,10);  
b =detemineTriangle (10,10,10);   
//a==b function does not appear to depend on global or static variables
Run Code Online (Sandbox Code Playgroud)

你觉得这个答案有什么问题吗?提前致谢.

Sat*_*Sat 5

你也应该检查边长.如您所知,2边的总长度必须大于最后边的长度.所以你也应该检查这样的事情:

if(x+y<=z || x+z<=y || z+y<=x)
    return ERROR;
Run Code Online (Sandbox Code Playgroud)

UPD:这是完整的解决方案(包括溢出检查):

inline bool isSidesOverflow(int a, int b)
{
    return b > INT_MAX - a;
}
int detemineTriangle(int x, int y, int z)
{
    if((x<=0) || (y<=0) || (z<=0)) return ERROR;
    // If all sides are equal and greater than 0 - no need to check overflow and validness.
    if(x == y && y == z) return EQUILATERAL;
    //Check overflow now
    if(isSidesOverflow(x,y) || isSidesOverflow(x,z) || isSidesOverflow(y,z)) return ERROR;
    //Check if it's valid triangle
    if(x+y<=z || x+z<=y || z+y<=x) return ERROR;
    if((x==y) || (x==z) || (y==z)) return ISOSCELES;
    return SCALENE;
}
Run Code Online (Sandbox Code Playgroud)

(没编译,随意通过评论报告错误)