1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
|
import SwiftFormat
/// Sanity checks and regression tests for the `respectsExistingLineBreaks` configuration setting
/// in both true and false states.
final class RespectsExistingLineBreaksTests: PrettyPrintTestCase {
func testExpressions() {
let input =
"""
a = b + c
+ d
+ e + f + g
+ h + i
"""
let expectedRespecting =
"""
a =
b + c
+ d
+ e + f
+ g
+ h + i
"""
assertPrettyPrintEqual(
input: input, expected: expectedRespecting, linelength: 12,
configuration: configuration(respectingExistingLineBreaks: true))
let expectedNotRespecting =
"""
a =
b + c + d + e + f + g
+ h + i
"""
assertPrettyPrintEqual(
input: input, expected: expectedNotRespecting, linelength: 25,
configuration: configuration(respectingExistingLineBreaks: false))
}
func testCodeBlocksAndMemberDecls() {
let input =
"""
import Module
import Other
struct FitsOnOneLine {
var x: Int
}
struct Foo {
var storedProperty: Int =
100
var readOnlyProperty: Int {
return
200
}
var readWriteProperty: Int {
get {
return
somethingElse
}
set {
somethingElse =
newValue
}
}
func oneLiner() -> Int {
return 500
}
func someFunction(
x: Int
) {
foo(x)
bar(x)
}
}
"""
// No changes expected when respecting existing newlines.
assertPrettyPrintEqual(
input: input, expected: input + "\n", linelength: 80,
configuration: configuration(respectingExistingLineBreaks: true))
let expectedNotRespecting =
"""
import Module
import Other
struct FitsOnOneLine { var x: Int }
struct Foo {
var storedProperty: Int = 100
var readOnlyProperty: Int { return 200 }
var readWriteProperty: Int {
get { return somethingElse }
set { somethingElse = newValue }
}
func oneLiner() -> Int { return 500 }
func someFunction(x: Int) {
foo(x)
bar(x)
}
}
"""
assertPrettyPrintEqual(
input: input, expected: expectedNotRespecting, linelength: 80,
configuration: configuration(respectingExistingLineBreaks: false))
}
func testSemicolons() {
let input =
"""
foo(); bar();
baz();
struct Foo {
var a: Int; var b: Int;
var c: Int;
}
"""
// When respecting newlines, we should leave semicolon-delimited statements and declarations on
// the same line if they were originally like that and likewise preserve newlines after
// semicolons if present.
assertPrettyPrintEqual(
input: input, expected: input + "\n", linelength: 80,
configuration: configuration(respectingExistingLineBreaks: true))
let expectedNotRespecting =
"""
foo();
bar();
baz();
struct Foo {
var a: Int;
var b: Int;
var c: Int;
}
"""
// When not respecting newlines every semicolon-delimited statement or declaration should end up
// on its own line.
assertPrettyPrintEqual(
input: input, expected: expectedNotRespecting, linelength: 80,
configuration: configuration(respectingExistingLineBreaks: false))
}
func testInvalidBreaksAreAlwaysRejected() {
// Verify that newlines in places where a break would not be allowed are removed, regardless of
// the configuration setting.
let input =
"""
func foo
(bar
: Int) ->
Int {
return bar * 2
}
"""
let expectedRespecting =
"""
func foo(bar: Int) -> Int {
return bar * 2
}
"""
assertPrettyPrintEqual(
input: input, expected: expectedRespecting, linelength: 80,
configuration: configuration(respectingExistingLineBreaks: true))
let expectedNotRespecting =
"""
func foo(bar: Int) -> Int { return bar * 2 }
"""
assertPrettyPrintEqual(
input: input, expected: expectedNotRespecting, linelength: 80,
configuration: configuration(respectingExistingLineBreaks: false))
}
/// Creates a new configuration with the given value for `respectsExistingLineBreaks` and default
/// values for everything else.
private func configuration(respectingExistingLineBreaks: Bool) -> Configuration {
var config = Configuration.forTesting
config.respectsExistingLineBreaks = respectingExistingLineBreaks
return config
}
}
|