iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 23
0
自我挑戰組

TDD - 紅燈,綠燈,重構,30天 TDD之路有你有我系列 第 23

Day23 這時間你看得懂嗎? Codewars_Human Readable Time

  • 分享至 

  • xImage
  •  

今天的題目難度是5kyu喔喔喔

https://ithelp.ithome.com.tw/upload/images/20180109/20107209GP3lIA7TSr.png

今天的題目長這樣

https://ithelp.ithome.com.tw/upload/images/20180109/20107209D2HdEQv9Q1.png

今天的題目需求需要將秒數換算成小時分鐘跟秒數。

現在就來拆一下題目吧。

  1. 換算小時的方法。
  2. 換算分鐘的方法。
  3. 換算剩餘秒數的方法。

一開始我們先來寫一個換算小時方法的測試資料吧!!

[TestMethod]
public void GetHour_Input_0_Should_Be_0()
{
    Assert.AreEqual(0, TimeFormat.GetHour(0));
}

而GetHour方法的Production Code 也就是老樣子會長成這個樣子

public static int GetHour(int num)
{
    throw new System.NotImplementedException();
}

老樣子,跑個測試,沒過很正常,紅燈,commit一下

接下來把Production Code改一下,用最簡單的方式解決他!

public static int GetHour(int num)
{
    return 0;
}

接下來跑個測試,PASS! Commit~

再來加上3600秒的測試。

[TestMethod]
public void GetHour_Input_3600_Should_Be_1()
{
    Assert.AreEqual(1, TimeFormat.GetHour(3600));
}

而GetHour方法的code就會長這個樣子

public static int GetHour(int num)
{
    return num / 3600;
}

接下來要寫計算分的方法的測試。

[TestMethod]
public void GetMin_Input_0_Should_Be_0()
{
    Assert.AreEqual(0,TimeFormat.GetMin(0));
}

這時候Production Code會變成

public static int GetMin(int num)
{
    return 0;
}

再來寫輸入3600的測試

 [TestMethod]
public void GetMin_Input_3600_Should_Be_0()
{
    Assert.AreEqual(0, TimeFormat.GetMin(3600));
}

這時候Production Code會變成這個概念

public static int GetMin(int num)
{
    return num / 60;
}

再來想到要寫正常的數字,所以就寫了輸入100秒的測試。

 [TestMethod]
public void GetMin_Input_100_Should_Be_1()
{
    Assert.AreEqual(1, TimeFormat.GetMin(100));
}

GetMin方法的Code最後會長成這個樣子。

public static int GetMin(int num)
{
    return num / 60 % 60;
}

最後要開始寫GetSec的方法測試啦。
第一個一樣是輸入0。

 [TestMethod]
public void GetSec_Input_0_Should_Be_0()
{
    Assert.AreEqual(0, TimeFormat.GetSec(0));
}

GetSec的Code就會長這個樣子。

public static int GetSec(int num)
{
    return 0;
}

再來寫一個輸入100的測試。

[TestMethod]
public void GetSec_Input_100_Should_Be_40()
{
    Assert.AreEqual(40, TimeFormat.GetSec(100));
}

GetSec方法的Code就會變成這個樣子

public static int GetSec(int num)
{
    return num % 60;
}

其實這樣就足夠涵蓋範圍了。
不過我還是補了一個輸入3600的測試案例這我就不多貼了。
接下來就要開始寫主要Production Code的測試啦!

[TestMethod]
public void Input_0_Should_Be_00_00_00()
{
    Assert.AreEqual("00:00:00", TimeFormat.GetReadableTime(0));
}

由於要加入中間的冒號跟判斷各個取得的時間是否小於零所以要加上幾個if並相加起來處理,所以ProductionCode 就變成這個樣子。

public static string GetReadableTime(int num)
{
    var hour = GetHour(num).ToString();
    var min = GetMin(num).ToString();
    var sec = GetSec(num).ToString();
    if (Convert.ToInt32(hour) < 10)
        hour = "0" + hour;
    if (Convert.ToInt32(min) < 10)
        min = "0" + min;
    if (GetSec(num) < 10)
        sec = "0" + sec;
    return hour + ":" + min + ":" + sec;
}

接下來補上一些test case,all pass之後Commit!

以下是所有的Production Code

public class TimeFormat
{
    public static int GetHour(int num)
    {
        return num / 3600;
    }

    public static int GetMin(int num)
    {
        return num / 60 % 60;
    }

    public static int GetSec(int num)
    {
        return num % 60;
    }

    public static string GetReadableTime(int num)
    {
        var hour = GetHour(num).ToString();
        var min = GetMin(num).ToString();
        var sec = GetSec(num).ToString();
        if (Convert.ToInt32(hour) < 10)
            hour = "0" + hour;
        if (Convert.ToInt32(min) < 10)
            min = "0" + min;
        if (GetSec(num) < 10)
            sec = "0" + sec;
        return hour + ":" + min + ":" + sec;
    }
}

以下是今天所有的測試案例

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void GetHour_Input_0_Should_Be_0()
    {
        Assert.AreEqual(0, TimeFormat.GetHour(0));
    }

    [TestMethod]
    public void GetHour_Input_3600_Should_Be_1()
    {
        Assert.AreEqual(1, TimeFormat.GetHour(3600));
    }

    [TestMethod]
    public void GetMin_Input_0_Should_Be_0()
    {
        Assert.AreEqual(0, TimeFormat.GetMin(0));
    }

    [TestMethod]
    public void GetMin_Input_3600_Should_Be_0()
    {
        Assert.AreEqual(0, TimeFormat.GetMin(3600));
    }

    [TestMethod]
    public void GetMin_Input_100_Should_Be_1()
    {
        Assert.AreEqual(1, TimeFormat.GetMin(100));
    }

    [TestMethod]
    public void GetSec_Input_0_Should_Be_0()
    {
        Assert.AreEqual(0, TimeFormat.GetSec(0));
    }

    [TestMethod]
    public void GetSec_Input_100_Should_Be_40()
    {
        Assert.AreEqual(40, TimeFormat.GetSec(100));
    }

    [TestMethod]
    public void GetSec_Input_3600_Should_Be_0()
    {
        Assert.AreEqual(0, TimeFormat.GetSec(3600));
    }

    [TestMethod]
    public void Input_0_Should_Be_00_00_00()
    {
        Assert.AreEqual("00:00:00", TimeFormat.GetReadableTime(0));
    }

    [TestMethod]
    public void Input_5_Should_Be_00_00_05()
    {
        Assert.AreEqual("00:00:05", TimeFormat.GetReadableTime(5));
    }

    [TestMethod]
    public void Input_60_Should_Be_00_01_00()
    {
        Assert.AreEqual("00:01:00", TimeFormat.GetReadableTime(60));
    }

    [TestMethod]
    public void Input_86399_Should_Be_23_59_59()
    {
        Assert.AreEqual("23:59:59", TimeFormat.GetReadableTime(86399));
    }

    [TestMethod]
    public void Input_359999_Should_Be_99_99_99()
    {
        Assert.AreEqual("99:59:59", TimeFormat.GetReadableTime(359999));
    }

}

現在就可以很愜意的上傳到Codewars然後就Pass啦!

https://ithelp.ithome.com.tw/upload/images/20180109/20107209G0Ts2AgUPQ.png

在Codewars上成功提交了~
來看一下其他人怎麼寫吧!

https://ithelp.ithome.com.tw/upload/images/20180109/20107209vOscD8NqH1.png

看起來我的寫法跟別人有點落差,別人用一行就解決了XD
不過我們的想法是一樣的。
只是我把東西都把它拆解開來了~

Git url :
https://github.com/SQZ777/Codewars_HumanReadableTime

Codewars Link:
https://www.codewars.com/kata/human-readable-time/train/csharp

下一題,明天見!


上一篇
Day22. 酷炫的兒童黑話 Codewars_Simple Pig Latin
下一篇
Day24 駝峰轉換器(?) Codewars_Convert String To Camel Case
系列文
TDD - 紅燈,綠燈,重構,30天 TDD之路有你有我30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言