[インデックス 13878] ファイルの概要
このコミットは、Go言語の公式フォーマッタである gofmt
に、CRLF (Carriage Return + Line Feed) の行末コードを含むファイルに対するテストケースを追加するものです。これにより、gofmt
がCRLFの行末をLF (Line Feed) に適切に変換することを確認し、異なるOS環境間でのコードの一貫性を保証します。
コミット
commit 83601807af568eb0131ebe300965cd6418da1dc5
Author: Robert Griesemer <gri@golang.org>
Date: Wed Sep 19 14:14:21 2012 -0700
gofmt: added testcase for files containing \r\n line endings
(see also issue 3961).
hexdump -c testdata/crlf.input
0000000 / * \r \n \t S o u r c e c o n t
0000010 a i n i n g C R / L F l i n
0000020 e e n d i n g s . \r \n \t T h e
0000030 g o f m t ' e d o u t p u t
0000040 m u s t o n l y h a v e
0000050 L F \r \n \t l i n e e n d i n g
0000060 s . \r \n * / \r \n p a c k a g e
0000070 m a i n \r \n \r \n f u n c m a i
0000080 n ( ) { \r \n \t / / l i n e
0000090 c o m m e n t \r \n \t p r i n t l
00000a0 n ( " h e l l o , w o r l d !
00000b0 " ) / / a n o t h e r l i
00000c0 n e c o m m e n t \r \n \t p r i
00000d0 n t l n ( ) \r \n } \r \n
00000db
hexdump -c testdata/crlf.golden
0000000 / * \n \t S o u r c e c o n t a
0000010 i n i n g C R / L F l i n e
0000020 e n d i n g s . \n \t T h e g
0000030 o f m t ' e d o u t p u t m
0000040 u s t o n l y h a v e L F
0000050 \n \t l i n e e n d i n g s . \n
0000060 * / \n p a c k a g e m a i n \n
0000070 \n f u n c m a i n ( ) { \n \t
0000080 / / l i n e c o m m e n t \n
0000090 \t p r i n t l n ( " h e l l o ,
00000a0 w o r l d ! " ) / / a n o
00000b0 t h e r l i n e c o m m e n
00000c0 t \n \t p r i n t l n ( ) \n } \n
00000cf
R=rsc
CC=golang-dev
https://golang.org/cl/6526052
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/83601807af568eb0131ebe300965cd6418da1dc5
元コミット内容
このコミットの元々の内容は、gofmt
ツールに対して、CRLF (Carriage Return + Line Feed) の行末コードを含むファイルが入力された場合のテストケースを追加することです。具体的には、testdata/crlf.input
というファイルにCRLFの行末を持つGoのソースコードを配置し、gofmt
がこれを処理した際に、すべての行末がLF (Line Feed) に変換された testdata/crlf.golden
と一致するかどうかを検証するテスト TestCRLF
が追加されています。これは、gofmt
が異なるオペレーティングシステム(特にWindowsとUnix/Linux)間でコードのフォーマットの一貫性を保つ上で重要な機能です。
変更の背景
この変更の背景には、Go言語のIssue 3961が存在します。このIssueは、gofmt
がCRLFの行末を持つファイルを適切に処理しない、または処理結果が期待通りにならないという問題提起がなされたものと推測されます。Windows環境で開発されたGoのソースコードは、デフォルトでCRLFの行末を持つことが一般的です。しかし、Unix/Linux環境ではLFの行末が標準です。gofmt
の目的は、Goのコードベース全体で一貫したフォーマットを強制することであり、行末コードの不一致は、異なるOSで作業する開発者間で不必要な差分を生み出し、バージョン管理システム上での混乱を招く可能性があります。
このコミットは、gofmt
がCRLFの入力に対しても、常にLFの出力を行うようにすることで、この問題を解決し、クロスプラットフォームでの開発体験を向上させることを目指しています。これにより、どのOSでコードが編集されても、gofmt
を通せば常に同じフォーマット(LFの行末)になることが保証されます。
前提知識の解説
1. gofmt
gofmt
は、Go言語のソースコードを自動的にフォーマットするためのツールです。Go言語の設計思想の一つに「意見の統一」があり、gofmt
はその思想を具現化する中心的なツールです。開発者がコードのスタイルについて議論する時間を削減し、すべてのGoコードが同じ見た目になるように強制することで、可読性と保守性を高めます。gofmt
は、インデント、スペース、改行、括弧の位置など、多くのフォーマット規則を自動的に適用します。
2. 行末コード (Line Endings)
テキストファイルにおける行の終わりを示す特殊な文字の組み合わせです。主なものとして以下の3種類があります。
- LF (Line Feed,
\n
, ASCII 10): Unix、Linux、macOS (OS X以降) で標準的に使用されます。単に「改行」を意味します。 - CRLF (Carriage Return + Line Feed,
\r\n
, ASCII 13 + ASCII 10): Windowsで標準的に使用されます。タイプライターの「キャリッジリターン(行頭に戻る)」と「ラインフィード(次の行に進む)」に由来します。 - CR (Carriage Return,
\r
, ASCII 13): 古いMac OS (OS 9以前) で使用されていました。
これらの違いは、特に異なるOS間でファイルを共有したり、バージョン管理システムを使用したりする際に問題を引き起こすことがあります。例えば、Windowsで編集されたファイルがCRLF行末を持ち、Unixで編集されたファイルがLF行末を持つ場合、同じ内容のファイルでも行末の違いによってバージョン管理システムが「変更があった」と誤認識し、不必要な差分(diff)が発生することがあります。
3. テスト駆動開発 (TDD) と回帰テスト (Regression Testing)
このコミットは、特定のバグ(Issue 3961)に対するテストケースを追加するものです。これは、テスト駆動開発(TDD)の原則や、回帰テストの重要性を示しています。
- テスト駆動開発 (TDD): ソフトウェア開発手法の一つで、機能の実装よりも先にテストコードを書くことを推奨します。これにより、要件の明確化、設計の改善、バグの早期発見に繋がります。
- 回帰テスト (Regression Testing): ソフトウェアに変更を加えた際に、既存の機能が意図せず壊れていないことを確認するためのテストです。このコミットのように、特定のバグが修正された後、そのバグが将来の変更によって再発しないことを保証するために、バグを再現するテストケースを追加することは、回帰テストの重要な側面です。
技術的詳細
このコミットは、gofmt
の行末処理に関する堅牢性を高めるためのテストインフラストラクチャの追加に焦点を当てています。
-
テストデータの準備:
src/cmd/gofmt/testdata/crlf.input
: このファイルは、意図的にCRLF (\r\n
) の行末を持つGoのソースコードを含んでいます。hexdump -c
の出力からもわかるように、各行の終わりに\r
と\n
の両方が存在します。src/cmd/gofmt/testdata/crlf.golden
: このファイルは、crlf.input
をgofmt
で処理した際に期待される出力です。すべての行末がLF (\n
) のみになっていることがhexdump -c
の出力から確認できます。これは、gofmt
がCRLFをLFに正規化するという挙動を期待していることを示しています。
-
テストケースの追加 (
gofmt_test.go
):var tests
スライスに{"testdata/crlf.input", ""}
というエントリが追加されています。これは、既存のTestRewrite
関数がcrlf.input
を処理し、その結果がcrlf.golden
と一致するかを自動的に検証するためのものです。TestCRLF
という新しいテスト関数が追加されています。この関数は、より詳細な検証を行います。- まず、
crlf.input
を読み込み、実際にCRLF (\r\n
) が含まれていることを確認します。もし含まれていなければ、テストの前提が崩れるためエラーを報告します。 - 次に、
crlf.golden
を読み込み、CR (\r
) が一切含まれていないことを確認します。これは、gofmt
の出力がLFのみであることを保証するための重要なチェックです。もしCRが含まれていれば、gofmt
がCRLFをLFに適切に変換できていないことを意味します。
- まず、
この二重のテストメカニズムにより、gofmt
がCRLFの入力に対して正しくLFの出力を生成するという挙動が、より確実に保証されます。
コアとなるコードの変更箇所
このコミットにおけるコアとなるコードの変更は、主にテストファイルの追加と既存のテストスイートへの組み込みです。
-
src/cmd/gofmt/gofmt_test.go
:var tests
スライスに新しいテストケースが追加されました。--- a/src/cmd/gofmt/gofmt_test.go +++ b/src/cmd/gofmt/gofmt_test.go @@ -81,6 +81,7 @@ var tests = []struct { {"testdata/stdin*.input", "-stdin"}, {"testdata/comments.input", ""}, {"testdata/import.input", ""}, +\t{"testdata/crlf.input", ""}, // test case for issue 3961; see also TestCRLF }
TestCRLF
という新しいテスト関数が追加されました。--- a/src/cmd/gofmt/gofmt_test.go +++ b/src/cmd/gofmt/gofmt_test.go @@ -103,3 +104,24 @@ func TestRewrite(t *testing.T) { } } } +\n+func TestCRLF(t *testing.T) { +\tconst input = "testdata/crlf.input" // must contain CR/LF's +\tconst golden = "testdata/crlf.golden" // must not contain any CR's +\n+\tdata, err := ioutil.ReadFile(input) +\tif err != nil { +\t\tt.Error(err) +\t} +\tif bytes.Index(data, []byte("\r\n")) < 0 { +\t\tt.Errorf("%s contains no CR/LF's", input) +\t} +\n+\tdata, err = ioutil.ReadFile(golden) +\tif err != nil { +\t\tt.Error(err) +\t} +\tif bytes.Index(data, []byte("\r")) >= 0 { +\t\tt.Errorf("%s contains CR's", golden) +\t} +}\n
-
src/cmd/gofmt/testdata/crlf.golden
:- 新しいファイルとして追加されました。このファイルは、
crlf.input
をgofmt
で処理した後の期待される出力(LF行末)を含みます。--- /dev/null +++ b/src/cmd/gofmt/testdata/crlf.golden @@ -0,0 +1,12 @@ +/* +\tSource containing CR/LF line endings. +\tThe gofmt'ed output must only have LF +\tline endings. +*/ +package main + +func main() { +\t// line comment +\tprintln("hello, world!") // another line comment +\tprintln()\ +}\
- 新しいファイルとして追加されました。このファイルは、
-
src/cmd/gofmt/testdata/crlf.input
:- 新しいファイルとして追加されました。このファイルは、CRLF行末を持つGoのソースコードを含みます。
--- /dev/null +++ b/src/cmd/gofmt/testdata/crlf.input @@ -0,0 +1,12 @@ +/*\r +\tSource containing CR/LF line endings.\r +\tThe gofmt'ed output must only have LF\r +\tline endings.\r +*/\r +package main\r +\r +func main() {\r +\t// line comment\r +\tprintln("hello, world!") // another line comment\r +\tprintln()\r +}\r
- 新しいファイルとして追加されました。このファイルは、CRLF行末を持つGoのソースコードを含みます。
コアとなるコードの解説
このコミットの「コアとなるコード」は、gofmt
自体のロジック変更ではなく、その挙動を検証するためのテストコードとテストデータです。
-
gofmt_test.go
のvar tests
への追加:gofmt
のテストスイートは、通常、入力ファイルと期待される出力ファイル(.golden
ファイル)のペアを使用して、gofmt
が正しくフォーマットを行うかを検証します。{"testdata/crlf.input", ""}
の追加は、crlf.input
がgofmt
によって処理され、その結果がcrlf.golden
と比較されることを意味します。これにより、gofmt
がCRLF行末をLF行末に変換する機能が、既存のテストフレームワークに組み込まれ、自動的に検証されるようになります。 -
TestCRLF
関数の実装: この関数は、gofmt
の行末処理に関する特定の側面を深く掘り下げて検証します。ioutil.ReadFile(input)
とbytes.Index(data, []byte("\r\n")) < 0
のチェックは、テストの前提条件(入力ファイルがCRLFを含んでいること)が満たされていることを保証します。もし入力ファイルがCRLFを含んでいなければ、このテストは意味をなさなくなります。ioutil.ReadFile(golden)
とbytes.Index(data, []byte("\r")) >= 0
のチェックは、gofmt
の出力がCRを含まない(つまりLFのみである)ことを厳密に検証します。これは、gofmt
がCRLFをLFに正規化するという、このコミットが対処しようとしている核心的な挙動を直接テストするものです。
これらのテストコードとテストデータは、gofmt
が異なる行末コードを持つファイルを一貫して処理し、Goコミュニティ全体でコードのフォーマット標準を維持するための重要な保証を提供します。
関連リンク
- Go Issue 3961:
gofmt
のCRLF行末処理に関する元の問題提起(このコミットの背景となったIssue) - Go言語の公式ドキュメント:
gofmt
について
参考にした情報源リンク
- Go Issue 3961 (上記に同じ)
- Gitのコミットメッセージと差分情報
hexdump
コマンドの出力解析に関する一般的な知識- 行末コード (CR, LF, CRLF) に関する一般的なコンピュータサイエンスの知識
- Go言語のテストフレームワーク (
testing
パッケージ) に関する知識 gofmt
ツールの目的と機能に関する一般的な知識
[インデックス 13878] ファイルの概要
このコミットは、Go言語の公式フォーマッタである gofmt
に、CRLF (Carriage Return + Line Feed) の行末コードを含むファイルに対するテストケースを追加するものです。これにより、gofmt
がCRLFの行末をLF (Line Feed) に適切に変換することを確認し、異なるOS環境間でのコードの一貫性を保証します。
コミット
commit 83601807af568eb0131ebe300965cd6418da1dc5
Author: Robert Griesemer <gri@golang.org>
Date: Wed Sep 19 14:14:21 2012 -0700
gofmt: added testcase for files containing \r\n line endings
(see also issue 3961).
hexdump -c testdata/crlf.input
0000000 / * \r \n \t S o u r c e c o n t
0000010 a i n i n g C R / L F l i n
0000020 e e n d i n g s . \r \n \t T h e
0000030 g o f m t ' e d o u t p u t
0000040 m u s t o n l y h a v e
0000050 L F \r \n \t l i n e e n d i n g
0000060 s . \r \n * / \r \n p a c k a g e
0000070 m a i n \r \n \r \n f u n c m a i
0000080 n ( ) { \r \n \t / / l i n e
0000090 c o m m e n t \r \n \t p r i n t l
00000a0 n ( " h e l l o , w o r l d !
00000b0 " ) / / a n o t h e r l i
00000c0 n e c o m m e n t \r \n \t p r i
00000d0 n t l n ( ) \r \n } \r \n
00000db
hexdump -c testdata/crlf.golden
0000000 / * \n \t S o u r c e c o n t a
0000010 i n i n g C R / L F l i n e
0000020 e n d i n g s . \n \t T h e g
0000030 o f m t ' e d o u t p u t m
0000040 u s t o n l y h a v e L F
0000050 \n \t l i n e e n d i n g s . \n
0000060 * / \n p a c k a g e m a i n \n
0000070 \n f u n c m a i n ( ) { \n \t
0000080 / / l i n e c o m m e n t \n
0000090 \t p r i n t l n ( " h e l l o ,
00000a0 w o r l d ! " ) / / a n o
00000b0 t h e r l i n e c o m m e n
00000c0 t \n \t p r i n t l n ( ) \n } \n
00000cf
R=rsc
CC=golang-dev
https://golang.org/cl/6526052
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/83601807af568eb0131ebe300965cd6418da1dc5
元コミット内容
このコミットの元々の内容は、gofmt
ツールに対して、CRLF (Carriage Return + Line Feed) の行末コードを含むファイルが入力された場合のテストケースを追加することです。具体的には、testdata/crlf.input
というファイルにCRLFの行末を持つGoのソースコードを配置し、gofmt
がこれを処理した際に、すべての行末がLF (Line Feed) に変換された testdata/crlf.golden
と一致するかどうかを検証するテスト TestCRLF
が追加されています。これは、gofmt
が異なるオペレーティングシステム(特にWindowsとUnix/Linux)間でコードのフォーマットの一貫性を保つ上で重要な機能です。
変更の背景
この変更の背景には、Go言語のIssue 3961(コミットメッセージに記載)に関連する、gofmt
がCRLFの行末を持つファイルを適切に処理しない、または処理結果が期待通りにならないという問題提起があります。Web検索の結果によると、「Issue 3961」は具体的なGitHub Issue番号ではなく、gofmt
とCRLF行末に関する一般的な問題提起を指している可能性があり、最も関連性の高い議論はGitHub Issue #16355「cmd/gofmt: doesn't honor line endings of Windows \r\n terminated source files」であると示唆されています。
Windows環境で開発されたGoのソースコードは、デフォルトでCRLFの行末を持つことが一般的です。しかし、Unix/Linux環境ではLFの行末が標準です。gofmt
の目的は、Goのコードベース全体で一貫したフォーマットを強制することであり、行末コードの不一致は、異なるOSで作業する開発者間で不必要な差分を生み出し、バージョン管理システム上での混乱を招く可能性があります。
このコミットは、gofmt
がCRLFの入力に対しても、常にLFの出力を行うようにすることで、この問題を解決し、クロスプラットフォームでの開発体験を向上させることを目指しています。これにより、どのOSでコードが編集されても、gofmt
を通せば常に同じフォーマット(LFの行末)になることが保証されます。
前提知識の解説
1. gofmt
gofmt
は、Go言語のソースコードを自動的にフォーマットするためのツールです。Go言語の設計思想の一つに「意見の統一」があり、gofmt
はその思想を具現化する中心的なツールです。開発者がコードのスタイルについて議論する時間を削減し、すべてのGoコードが同じ見た目になるように強制することで、可読性と保守性を高めます。gofmt
は、インデント、スペース、改行、括弧の位置など、多くのフォーマット規則を自動的に適用します。
2. 行末コード (Line Endings)
テキストファイルにおける行の終わりを示す特殊な文字の組み合わせです。主なものとして以下の3種類があります。
- LF (Line Feed,
\n
, ASCII 10): Unix、Linux、macOS (OS X以降) で標準的に使用されます。単に「改行」を意味します。 - CRLF (Carriage Return + Line Feed,
\r\n
, ASCII 13 + ASCII 10): Windowsで標準的に使用されます。タイプライターの「キャリッジリターン(行頭に戻る)」と「ラインフィード(次の行に進む)」に由来します。 - CR (Carriage Return,
\r
, ASCII 13): 古いMac OS (OS 9以前) で使用されていました。
これらの違いは、特に異なるOS間でファイルを共有したり、バージョン管理システムを使用したりする際に問題を引き起こすことがあります。例えば、Windowsで編集されたファイルがCRLF行末を持ち、Unixで編集されたファイルがLF行末を持つ場合、同じ内容のファイルでも行末の違いによってバージョン管理システムが「変更があった」と誤認識し、不必要な差分(diff)が発生することがあります。
3. テスト駆動開発 (TDD) と回帰テスト (Regression Testing)
このコミットは、特定のバグ(Issue 3961)に対するテストケースを追加するものです。これは、テスト駆動開発(TDD)の原則や、回帰テストの重要性を示しています。
- テスト駆動開発 (TDD): ソフトウェア開発手法の一つで、機能の実装よりも先にテストコードを書くことを推奨します。これにより、要件の明確化、設計の改善、バグの早期発見に繋がります。
- 回帰テスト (Regression Testing): ソフトウェアに変更を加えた際に、既存の機能が意図せず壊れていないことを確認するためのテストです。このコミットのように、特定のバグが修正された後、そのバグが将来の変更によって再発しないことを保証するために、バグを再現するテストケースを追加することは、回帰テストの重要な側面です。
技術的詳細
このコミットは、gofmt
の行末処理に関する堅牢性を高めるためのテストインフラストラクチャの追加に焦点を当てています。
-
テストデータの準備:
src/cmd/gofmt/testdata/crlf.input
: このファイルは、意図的にCRLF (\r\n
) の行末を持つGoのソースコードを含んでいます。hexdump -c
の出力からもわかるように、各行の終わりに\r
と\n
の両方が存在します。src/cmd/gofmt/testdata/crlf.golden
: このファイルは、crlf.input
をgofmt
で処理した際に期待される出力です。すべての行末がLF (\n
) のみになっていることがhexdump -c
の出力から確認できます。これは、gofmt
がCRLFをLFに正規化するという挙動を期待していることを示しています。
-
テストケースの追加 (
gofmt_test.go
):var tests
スライスに{"testdata/crlf.input", ""}
というエントリが追加されています。これは、既存のTestRewrite
関数がcrlf.input
を処理し、その結果がcrlf.golden
と一致するかを自動的に検証するためのものです。TestCRLF
という新しいテスト関数が追加されています。この関数は、より詳細な検証を行います。- まず、
crlf.input
を読み込み、実際にCRLF (\r\n
) が含まれていることを確認します。もし含まれていなければ、テストの前提が崩れるためエラーを報告します。 - 次に、
crlf.golden
を読み込み、CR (\r
) が一切含まれていないことを確認します。これは、gofmt
の出力がLFのみであることを保証するための重要なチェックです。もしCRが含まれていれば、gofmt
がCRLFをLFに適切に変換できていないことを意味します。
- まず、
この二重のテストメカニズムにより、gofmt
がCRLFの入力に対して正しくLFの出力を生成するという挙動が、より確実に保証されます。
コアとなるコードの変更箇所
このコミットにおけるコアとなるコードの変更は、主にテストファイルの追加と既存のテストスイートへの組み込みです。
-
src/cmd/gofmt/gofmt_test.go
:var tests
スライスに新しいテストケースが追加されました。--- a/src/cmd/gofmt/gofmt_test.go +++ b/src/cmd/gofmt/gofmt_test.go @@ -81,6 +81,7 @@ var tests = []struct { {"testdata/stdin*.input", "-stdin"}, {"testdata/comments.input", ""}, {"testdata/import.input", ""}, +\t{"testdata/crlf.input", ""}, // test case for issue 3961; see also TestCRLF }
TestCRLF
という新しいテスト関数が追加されました。--- a/src/cmd/gofmt/gofmt_test.go +++ b/src/cmd/gofmt/gofmt_test.go @@ -103,3 +104,24 @@ func TestRewrite(t *testing.T) { } } } +\n+func TestCRLF(t *testing.T) { +\tconst input = "testdata/crlf.input" // must contain CR/LF's +\tconst golden = "testdata/crlf.golden" // must not contain any CR's +\n+\tdata, err := ioutil.ReadFile(input) +\tif err != nil { +\t\tt.Error(err) +\t} +\tif bytes.Index(data, []byte("\r\n")) < 0 { +\t\tt.Errorf("%s contains no CR/LF's", input) +\t} +\n+\tdata, err = ioutil.ReadFile(golden) +\tif err != nil { +\t\tt.Error(err) +\t} +\tif bytes.Index(data, []byte("\r")) >= 0 { +\t\tt.Errorf("%s contains CR's", golden) +\t} +}\n
-
src/cmd/gofmt/testdata/crlf.golden
:- 新しいファイルとして追加されました。このファイルは、
crlf.input
をgofmt
で処理した後の期待される出力(LF行末)を含みます。--- /dev/null +++ b/src/cmd/gofmt/testdata/crlf.golden @@ -0,0 +1,12 @@ +/* +\tSource containing CR/LF line endings. +\tThe gofmt'ed output must only have LF +\tline endings. +*/ +package main + +func main() { +\t// line comment +\tprintln("hello, world!") // another line comment +\tprintln()\ +}\
- 新しいファイルとして追加されました。このファイルは、
-
src/cmd/gofmt/testdata/crlf.input
:- 新しいファイルとして追加されました。このファイルは、CRLF行末を持つGoのソースコードを含みます。
--- /dev/null +++ b/src/cmd/gofmt/testdata/crlf.input @@ -0,0 +1,12 @@ +/*\r +\tSource containing CR/LF line endings.\r +\tThe gofmt'ed output must only have LF\r +\tline endings.\r +*/\r +package main\r +\r +func main() {\r +\t// line comment\r +\tprintln("hello, world!") // another line comment\r +\tprintln()\r +}\r
- 新しいファイルとして追加されました。このファイルは、CRLF行末を持つGoのソースコードを含みます。
コアとなるコードの解説
このコミットの「コアとなるコード」は、gofmt
自体のロジック変更ではなく、その挙動を検証するためのテストコードとテストデータです。
-
gofmt_test.go
のvar tests
への追加:gofmt
のテストスイートは、通常、入力ファイルと期待される出力ファイル(.golden
ファイル)のペアを使用して、gofmt
が正しくフォーマットを行うかを検証します。{"testdata/crlf.input", ""}
の追加は、crlf.input
がgofmt
によって処理され、その結果がcrlf.golden
と比較されることを意味します。これにより、gofmt
がCRLF行末をLF行末に変換する機能が、既存のテストフレームワークに組み込まれ、自動的に検証されるようになります。 -
TestCRLF
関数の実装: この関数は、gofmt
の行末処理に関する特定の側面を深く掘り下げて検証します。ioutil.ReadFile(input)
とbytes.Index(data, []byte("\r\n")) < 0
のチェックは、テストの前提条件(入力ファイルがCRLFを含んでいること)が満たされていることを保証します。もし入力ファイルがCRLFを含んでいなければ、このテストは意味をなさなくなります。ioutil.ReadFile(golden)
とbytes.Index(data, []byte("\r")) >= 0
のチェックは、gofmt
の出力がCRを含まない(つまりLFのみである)ことを厳密に検証します。これは、gofmt
がCRLFをLFに正規化するという、このコミットが対処しようとしている核心的な挙動を直接テストするものです。
これらのテストコードとテストデータは、gofmt
が異なる行末コードを持つファイルを一貫して処理し、Goコミュニティ全体でコードのフォーマット標準を維持するための重要な保証を提供します。
関連リンク
- Go Issue 3961:
gofmt
のCRLF行末処理に関する元の問題提起(このコミットの背景となったIssue) - Go言語の公式ドキュメント:
gofmt
について - GitHub Issue #16355: cmd/gofmt: doesn't honor line endings of Windows \r\n terminated source files (関連する議論)
参考にした情報源リンク
- Go Issue 3961 (上記に同じ)
- Gitのコミットメッセージと差分情報
hexdump
コマンドの出力解析に関する一般的な知識- 行末コード (CR, LF, CRLF) に関する一般的なコンピュータサイエンスの知識
- Go言語のテストフレームワーク (
testing
パッケージ) に関する知識 gofmt
ツールの目的と機能に関する一般的な知識- Web検索結果: "Go issue 3961 gofmt CRLF"