File: Test.SnapshotTests.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (133 lines) | stat: -rw-r--r-- 4,380 bytes parent folder | download
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
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2023 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for Swift project authors
//

#if !SWT_NO_SNAPSHOT_TYPES
@_spi(Experimental) @_spi(ForToolsIntegrationOnly) @testable import Testing

@Suite("Test.Snapshot tests")
struct Test_SnapshotTests {
#if canImport(Foundation)
  @Test("Codable")
  func codable() throws {
    let test = try #require(Test.current)
    let snapshot = Test.Snapshot(snapshotting: test)
    let decoded = try JSON.encodeAndDecode(snapshot)

    #expect(decoded.id == snapshot.id)
    #expect(decoded.name == snapshot.name)
    #expect(decoded.displayName == snapshot.displayName)
    #expect(decoded.sourceLocation == snapshot.sourceLocation)
    // FIXME: Compare traits as well, once they are included.
    #expect(decoded.parameters == snapshot.parameters)
  }
#endif

  @Test("isParameterized property")
  func isParameterized() async throws {
    do {
      let test = try #require(Test.current)
      let snapshot = Test.Snapshot(snapshotting: test)
      #expect(!snapshot.isParameterized)
    }
    do {
      let test = try #require(await testFunction(named: "parameterized(i:)", in: MainActorIsolatedTests.self))
      let snapshot = Test.Snapshot(snapshotting: test)
      #expect(snapshot.isParameterized)
    }
    do {
      let suite = try #require(await test(for: Self.self))
      let snapshot = Test.Snapshot(snapshotting: suite)
      #expect(!snapshot.isParameterized)
    }
  }

  @Test("isSuite property")
  func isSuite() async throws {
    do {
      let test = try #require(Test.current)
      let snapshot = Test.Snapshot(snapshotting: test)
      #expect(!snapshot.isSuite)
    }
    do {
      let test = try #require(await testFunction(named: "parameterized(i:)", in: MainActorIsolatedTests.self))
      let snapshot = Test.Snapshot(snapshotting: test)
      #expect(!snapshot.isSuite)
    }
    do {
      let suite = try #require(await test(for: Self.self))
      let snapshot = Test.Snapshot(snapshotting: suite)
      #expect(snapshot.isSuite)
    }
  }

  /// This is a comment that should show up in the test's `comments` property.
  @Test("comments property")
  func comments() async throws {
    let test = try #require(Test.current)
    let snapshot = Test.Snapshot(snapshotting: test)

    #expect(!snapshot.comments.isEmpty)
    #expect(snapshot.comments == test.comments)
  }

  @Test("tags property", .tags(Tag.testTag))
  func tags() async throws {
    let test = try #require(Test.current)
    let snapshot = Test.Snapshot(snapshotting: test)

    #expect(snapshot.tags.count == 1)
    #expect(snapshot.tags.first == Tag.testTag)
  }

  @Test("associatedBugs property", bug)
  func associatedBugs() async throws {
    let test = try #require(Test.current)
    let snapshot = Test.Snapshot(snapshotting: test)

    #expect(snapshot.associatedBugs.count == 1)
    #expect(snapshot.associatedBugs.first == Self.bug)
  }

  private static let bug: Bug = Bug.bug(id: 12345, "Lorem ipsum")

  @available(_clockAPI, *)
  @Test("timeLimit property", _timeLimitIfAvailable(minutes: 999_999_999))
  func timeLimit() async throws {
    let test = try #require(Test.current)
    let snapshot = Test.Snapshot(snapshotting: test)

    #expect(snapshot.timeLimit == .seconds(60) * 999_999_999)
  }

  /// Create a time limit trait representing the specified number of minutes, if
  /// running on an OS which supports time limits.
  ///
  /// - Parameters:
  ///   - minutes: The number of minutes the returned time limit trait should
  ///     represent.
  ///
  /// - Returns: A time limit trait if the API is available, otherwise a
  ///   disabled trait.
  ///
  /// This is provided in order to work around a bug where traits with
  /// conditional API availability are not guarded by `@available` attributes on
  /// `@Test` functions (rdar://127811571).
  private static func _timeLimitIfAvailable(minutes: some BinaryInteger) -> any TestTrait {
    guard #available(_clockAPI, *) else {
      return .disabled(".timeLimit() not available")
    }
    return .timeLimit(.minutes(minutes))
  }
}

extension Tag {
  @Tag fileprivate static var testTag: Self
}
#endif