Repository: JanDeDobbeleer/oh-my-posh
Pull request #5925 (2024-11-24 07:56:52)

feat: next version
### Prerequisites

- [x] I have read and understood the [contributing guide][CONTRIBUTING.md].
- [x] The commit message follows the [conventional commits][cc] guidelines.
- [x] Tests for the changes have been added (for bug fixes / features).
- [x] Docs have been added/updated (for bug fixes / features).

<!---

Tips:

If you're not comfortable with working with Git,
we're working a guide (https://ohmyposh.dev/docs/contributing/git) to help you out.
Oh My Posh advises GitKraken (https://www.gitkraken.com/invite/nQmDPR9D) as your preferred cross platform Git GUI power tool.

-->

[CONTRIBUTING.md]: https://github.com/JanDeDobbeleer/oh-my-posh/blob/main/CONTRIBUTING.md
[cc]: https://www.conventionalcommits.org/en/v1.0.0/#summary



Patch:
diff --git a/.github/workflows/msi.yml b/.github/workflows/msi.yml
index 69a284f0..3b3f073e 100644
--- a/.github/workflows/msi.yml
+++ b/.github/workflows/msi.yml
@@ -16,6 +16,8 @@ jobs:
     steps:
       - name: Checkout code 👋
         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
+      - name: Install Wix Toolset 🛠
+        run: dotnet tool install --global wix
       - name: Build installer 📦
         id: build
         env:
diff --git a/packages/msi/build.ps1 b/packages/msi/build.ps1
index c5d794f8..f0bee419 100644
--- a/packages/msi/build.ps1
+++ b/packages/msi/build.ps1
@@ -20,9 +20,14 @@ New-Item -Path "." -Name "out" -ItemType Directory -ErrorAction SilentlyContinue
 
 if ($Download) {
     # download the executable
-    $file = "posh-windows-$Architecture.exe"
+    switch ($Architecture) {
+        'x86' { $file = "posh-windows-386.exe" }
+        'x64' { $file = "posh-windows-amd64.exe" }
+        Default { $file = "posh-windows-$Architecture.exe" }
+    }
+
     $name = "oh-my-posh.exe"
-    $url = "https://github.com/jandedobbeleer/oh-my-posh/releases/download/v$Version/$($file)"
+    $url = "https://github.com/jandedobbeleer/oh-my-posh/releases/download/v$Version/$file"
     Invoke-WebRequest $url -Out "./dist/$($name)"
 }
 
diff --git a/src/config/segment_types.go b/src/config/segment_types.go
index 6d4193b8..2a27e64d 100644
--- a/src/config/segment_types.go
+++ b/src/config/segment_types.go
@@ -85,6 +85,8 @@ const (
 	EXIT SegmentType = "exit"
 	// FLUTTER writes the flutter version
 	FLUTTER SegmentType = "flutter"
+	// FORTRAN writes the gfortran version
+	FORTRAN SegmentType = "fortran"
 	// FOSSIL writes the fossil status
 	FOSSIL SegmentType = "fossil"
 	// GCP writes the active GCP context
@@ -183,6 +185,8 @@ const (
 	STATUS SegmentType = "status"
 	// STRAVA is a sports activity tracker
 	STRAVA SegmentType = "strava"
+	// Svelte segment
+	SVELTE SegmentType = "svelte"
 	// Subversion segment
 	SVN SegmentType = "svn"
 	// SWIFT writes the active swift version
@@ -191,6 +195,8 @@ const (
 	SYSTEMINFO SegmentType = "sysinfo"
 	// TALOSCTL writes the talosctl context
 	TALOSCTL SegmentType = "talosctl"
+	// Tauri Segment
+	TAURI SegmentType = "tauri"
 	// TERRAFORM writes the terraform workspace we're currently in
 	TERRAFORM SegmentType = "terraform"
 	// TEXT writes a text
@@ -254,6 +260,7 @@ var Segments = map[SegmentType]func() SegmentWriter{
 	ELIXIR:          func() SegmentWriter { return &segments.Elixir{} },
 	EXIT:            func() SegmentWriter { return &segments.Status{} },
 	FLUTTER:         func() SegmentWriter { return &segments.Flutter{} },
+	FORTRAN:         func() SegmentWriter { return &segments.Fortran{} },
 	FOSSIL:          func() SegmentWriter { return &segments.Fossil{} },
 	GCP:             func() SegmentWriter { return &segments.Gcp{} },
 	FIREBASE:        func() SegmentWriter { return &segments.Firebase{} },
@@ -303,10 +310,12 @@ var Segments = map[SegmentType]func() SegmentWriter{
 	SPOTIFY:         func() SegmentWriter { return &segments.Spotify{} },
 	STATUS:          func() SegmentWriter { return &segments.Status{} },
 	STRAVA:          func() SegmentWriter { return &segments.Strava{} },
+	SVELTE:          func() SegmentWriter { return &segments.Svelte{} },
 	SVN:             func() SegmentWriter { return &segments.Svn{} },
 	SWIFT:           func() SegmentWriter { return &segments.Swift{} },
 	SYSTEMINFO:      func() SegmentWriter { return &segments.SystemInfo{} },
 	TALOSCTL:        func() SegmentWriter { return &segments.TalosCTL{} },
+	TAURI:           func() SegmentWriter { return &segments.Tauri{} },
 	TERRAFORM:       func() SegmentWriter { return &segments.Terraform{} },
 	TEXT:            func() SegmentWriter { return &segments.Text{} },
 	TIME:            func() SegmentWriter { return &segments.Time{} },
diff --git a/src/segments/fortran.go b/src/segments/fortran.go
new file mode 100644
index 00000000..cff853d0
--- /dev/null
+++ b/src/segments/fortran.go
@@ -0,0 +1,30 @@
+package segments
+
+type Fortran struct {
+	language
+}
+
+func (f *Fortran) Template() string {
+	return languageTemplate
+}
+
+func (f *Fortran) Enabled() bool {
+	f.extensions = []string{
+		"*.f", "*.for", "*.fpp",
+		"*.f77", "*.f90", "*.f95",
+		"*.f03", "*.f08",
+		"*.F", "*.FOR", "*.FPP",
+		"*.F77", "*.F90", "*.F95",
+		"*.F03", "*.F08",
+		"fpm.toml",
+	}
+	f.commands = []*cmd{
+		{
+			executable: "gfortran",
+			args:       []string{"--version"},
+			regex:      `GNU Fortran \(.*\) (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`,
+		},
+	}
+
+	return f.language.Enabled()
+}
diff --git a/src/segments/svelte.go b/src/segments/svelte.go
new file mode 100644
index 00000000..1f0ca821
--- /dev/null
+++ b/src/segments/svelte.go
@@ -0,0 +1,30 @@
+package segments
+
+type Svelte struct {
+	language
+}
+
+func (s *Svelte) Template() string {
+	return languageTemplate
+}
+
+func (s *Svelte) Enabled() bool {
+	if !s.hasNodePackage("svelte") {
+		return false
+	}
+
+	s.extensions = []string{"package.json"}
+	s.commands = []*cmd{
+		{
+			regex:      `(?:(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`,
+			getVersion: s.getVersion,
+		},
+	}
+	s.versionURLTemplate = "https://github.com/sveltejs/svelte/releases/tag/svelte%40{{.Full}}"
+
+	return s.language.Enabled()
+}
+
+func (s *Svelte) getVersion() (string, error) {
+	return s.nodePackageVersion("svelte")
+}
diff --git a/src/segments/tauri.go b/src/segments/tauri.go
new file mode 100644
index 00000000..728d9f79
--- /dev/null
+++ b/src/segments/tauri.go
@@ -0,0 +1,30 @@
+package segments
+
+import (
+	"path/filepath"
+)
+
+type Tauri struct {
+	language
+}
+
+func (t *Tauri) Template() string {
+	return languageTemplate
+}
+
+func (t *Tauri) Enabled() bool {
+	t.extensions = []string{"package.json"}
+	t.commands = []*cmd{
+		{
+			regex:      `(?:(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`,
+			getVersion: t.getVersion,
+		},
+	}
+	t.versionURLTemplate = "https://github.com/tauri-apps/tauri/releases/tag/tauri-v{{.Full}}"
+
+	return t.language.Enabled()
+}
+
+func (t *Tauri) getVersion() (string, error) {
+	return t.nodePackageVersion(filepath.Join("@tauri-apps", "api"))
+}
diff --git a/themes/schema.json b/themes/schema.json
index 4e46cd17..7d618f33 100644
--- a/themes/schema.json
+++ b/themes/schema.json
@@ -339,6 +339,7 @@
             "fossil",
             "gcp",
             "firebase",
+            "fortran",
             "git",
             "gitversion",
             "go",
@@ -385,9 +386,11 @@
             "shell",
             "sysinfo",
             "strava",
+            "svelte",
             "svn",
             "swift",
             "talosctl",
+            "tauri",
             "time",
             "text",
             "terraform",
@@ -1239,6 +1242,60 @@
             }
           }
         },
+        {
+          "if": {
+            "properties": {
+              "type": {
+                "const": "fortran"
+              }
+            }
+          },
+          "then": {
+            "title": "Fortran Segment",
+            "description": "https://ohmyposh.dev/docs/segments/languages/fortran",
+            "properties": {
+              "properties": {
+                "properties": {
+                  "home_enabled": {
+                    "$ref": "#/definitions/home_enabled"
+                  },
+                  "fetch_version": {
+                    "$ref": "#/definitions/fetch_version"
+                  },
+                  "cache_duration": {
+                    "$ref": "#/definitions/cache_duration",
+                    "default": "none"
+                  },
+                  "display_mode": {
+                    "$ref": "#/definitions/display_mode"
+                  },
+                  "missing_command_text": {
+                    "$ref": "#/definitions/missing_command_text"
+                  },
+                  "version_url_template": {
+                    "$ref": "#/definitions/version_url_template"
+                  },
+                  "extensions": {
+                    "type": "array",
+                    "title": "Extensions",
+                    "description": "The extensions to look for when determining if a folder is a Fortran workspace",
+                    "default": [
+                      "fpm.toml",
+                      "*.f", "*.for", "*.fpp", "*.f77", "*.f90", "*.f95", "*.f03", "*.f08",
+                      "*.F", "*.FOR", "*.FPP", "*.F77", "*.F90", "*.F95", "*.F03", "*.F08"
+                    ],
+                    "items": {
+                      "type": "string"
+                    }
+                  },
+                  "folders": {
+                    "$ref": "#/definitions/folders"
+                  }
+                }
+              }
+            }
+          }
+        },
         {
           "if": {
             "properties": {
@@ -4844,6 +4901,110 @@
               }
             }
           }
+        },
+        {
+          "if": {
+            "properties": {
+              "type": {
+                "const": "tauri"
+              }
+            }
+          },
+          "then": {
+            "title": "Tauri Segment",
+            "description": "https://ohmyposh.dev/docs/segments/cli/tauri",
+            "properties": {
+              "properties": {
+                "properties": {
+                  "home_enabled": {
+                    "$ref": "#/definitions/home_enabled"
+                  },
+                  "fetch_version": {
+                    "$ref": "#/definitions/fetch_version"
+                  },
+                  "cache_duration": {
+                    "$ref": "#/definitions/cache_duration",
+                    "default": "none"
+                  },
+                  "display_mode": {
+                    "$ref": "#/definitions/display_mode"
+                  },
+                  "missing_command_text": {
+                    "$ref": "#/definitions/missing_command_text"
+                  },
+                  "version_url_template": {
+                    "$ref": "#/definitions/version_url_template"
+                  },
+                  "extensions": {
+                    "type": "array",
+                    "title": "Extensions",
+                    "description": "The extensions to look for when determining if the current directory is a Tauri project",
+                    "default": [
+                      "package.json"
+                    ],
+                    "items": {
+                      "type": "string"
+                    }
+                  },
+                  "folders": {
+                    "$ref": "#/definitions/folders"
+                  }
+                }
+              }
+            }
+          }
+        },
+        {
+          "if": {
+            "properties": {
+              "type": {
+                "const": "svelte"
+              }
+            }
+          },
+          "then": {
+            "title": "Svelte Segment",
+            "description": "https://ohmyposh.dev/docs/segments/cli/svelte",
+            "properties": {
+              "properties": {
+                "properties": {
+                  "home_enabled": {
+                    "$ref": "#/definitions/home_enabled"
+                  },
+                  "fetch_version": {
+                    "$ref": "#/definitions/fetch_version"
+                  },
+                  "cache_duration": {
+                    "$ref": "#/definitions/cache_duration",
+                    "default": "none"
+                  },
+                  "display_mode": {
+                    "$ref": "#/definitions/display_mode"
+                  },
+                  "missing_command_text": {
+                    "$ref": "#/definitions/missing_command_text"
+                  },
+                  "version_url_template": {
+                    "$ref": "#/definitions/version_url_template"
+                  },
+                  "extensions": {
+                    "type": "array",
+                    "title": "Extensions",
+                    "description": "The extensions to look for when determining if the current directory is a Svelte project",
+                    "default": [
+                      "package.json"
+                    ],
+                    "items": {
+                      "type": "string"
+                    }
+                  },
+                  "folders": {
+                    "$ref": "#/definitions/folders"
+                  }
+                }
+              }
+            }
+          }
         }
       ]
     }
diff --git a/website/docs/segments/cli/svelte.mdx b/website/docs/segments/cli/svelte.mdx
new file mode 100644
index 00000000..dac577cc
--- /dev/null
+++ b/website/docs/segments/cli/svelte.mdx
@@ -0,0 +1,63 @@
+---
+id: svelte
+title: Svelte
+sidebar_label: Svelte
+---
+
+## What
+
+Display the currently active Svelte version.
+
+## Sample Configuration
+
+import Config from "@site/src/components/Config.js";
+
+<Config
+  data={{
+    type: "svelte",
+    style: "powerline",
+    powerline_symbol: "\uE0B0",
+    foreground: "#000000",
+    background: "#1976d2",
+    template: " \ue697 {{ .Full }} ",
+  }}
+/>
+
+## Properties
+
+| Name                   |    Type    |    Default     | Description                                                                                                                                                                                                                          |
+| ---------------------- | :--------: | :------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `home_enabled`         | `boolean`  |    `false`     | display the segment in the HOME folder or not                                                                                                                                                                                        |
+| `fetch_version`        | `boolean`  |     `true`     | fetch the svelte version                                                                                                                                                                                                             |
+| `cache_duration`       |  `string`  |     `24h`      | the duration for which the version will be cached. The duration is a string in the format `1h2m3s` and is parsed using the [time.ParseDuration] function from the Go standard library. To disable the cache, use `none`              |
+| `missing_command_text` |  `string`  |                | text to display when the command is missing                                                                                                                                                                                          |
+| `display_mode`         |  `string`  |   `context`    | <ul><li>`always`: the segment is always displayed</li><li>`files`: the segment is only displayed when file `extensions` listed are present</li><li>`context`: displays the segment when the environment or files is active</li></ul> |
+| `version_url_template` |  `string`  |                | a go [text/template][go-text-template] [template][templates] that creates the URL of the version info / release notes                                                                                                                |
+| `extensions`           | `[]string` | `angular.json` | allows to override the default list of file extensions to validate                                                                                                                                                                   |
+| `folders`              | `[]string` |                | allows to override the list of folder names to validate                                                                                                                                                                              |
+
+## Template ([info][templates])
+
+:::note default template
+
+```template
+{{ if .Error }}{{ .Error }}{{ else }}{{ .Full }}{{ end }}
+```
+
+:::
+
+### Properties
+
+| Name     | Type     | Description                                        |
+| -------- | -------- | -------------------------------------------------- |
+| `.Full`  | `string` | the full version                                   |
+| `.Major` | `string` | major number                                       |
+| `.Minor` | `string` | minor number                                       |
+| `.Patch` | `string` | patch number                                       |
+| `.URL`   | `string` | URL of the version info / release notes            |
+| `.Error` | `string` | error encountered when fetching the version string |
+
+[go-text-template]: https://golang.org/pkg/text/template/
+[templates]: /docs/configuration/templates
+[svelte-docs]: https://svelte.dev/docs/svelte/overview
+[time.ParseDuration]: https://golang.org/pkg/time/#ParseDuration
diff --git a/website/docs/segments/cli/tauri.mdx b/website/docs/segments/cli/tauri.mdx
new file mode 100644
index 00000000..7d407e28
--- /dev/null
+++ b/website/docs/segments/cli/tauri.mdx
@@ -0,0 +1,63 @@
+---
+id: tauri
+title: Tauri
+sidebar_label: Tauri
+---
+
+## What
+
+Display the currently active Tauri version.
+
+## Sample Configuration
+
+import Config from "@site/src/components/Config.js";
+
+<Config
+  data={{
+    type: "tauri",
+    style: "powerline",
+    powerline_symbol: "\uE0B0",
+    foreground: "#000000",
+    background: "#1976d2",
+    template: " \ue8bb {{ .Full }} ",
+  }}
+/>
+
+## Properties
+
+| Name                   |    Type    |    Default     | Description                                                                                                                                                                                                                          |
+| ---------------------- | :--------: | :------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `home_enabled`         | `boolean`  |    `false`     | display the segment in the HOME folder or not                                                                                                                                                                                        |
+| `fetch_version`        | `boolean`  |     `true`     | fetch the tauri version                                                                                                                                                                                                              |
+| `cache_duration`       |  `string`  |     `24h`      | the duration for which the version will be cached. The duration is a string in the format `1h2m3s` and is parsed using the [time.ParseDuration] function from the Go standard library. To disable the cache, use `none`              |
+| `missing_command_text` |  `string`  |                | text to display when the command is missing                                                                                                                                                                                          |
+| `display_mode`         |  `string`  |   `context`    | <ul><li>`always`: the segment is always displayed</li><li>`files`: the segment is only displayed when file `extensions` listed are present</li><li>`context`: displays the segment when the environment or files is active</li></ul> |
+| `version_url_template` |  `string`  |                | a go [text/template][go-text-template] [template][templates] that creates the URL of the version info / release notes                                                                                                                |
+| `extensions`           | `[]string` | `angular.json` | allows to override the default list of file extensions to validate                                                                                                                                                                   |
+| `folders`              | `[]string` |                | allows to override the list of folder names to validate                                                                                                                                                                              |
+
+## Template ([info][templates])
+
+:::note default template
+
+```template
+{{ if .Error }}{{ .Error }}{{ else }}{{ .Full }}{{ end }}
+```
+
+:::
+
+### Properties
+
+| Name     | Type     | Description                                        |
+| -------- | -------- | -------------------------------------------------- |
+| `.Full`  | `string` | the full version                                   |
+| `.Major` | `string` | major number                                       |
+| `.Minor` | `string` | minor number                                       |
+| `.Patch` | `string` | patch number                                       |
+| `.URL`   | `string` | URL of the version info / release notes            |
+| `.Error` | `string` | error encountered when fetching the version string |
+
+[go-text-template]: https://golang.org/pkg/text/template/
+[templates]: /docs/configuration/templates
+[tauri-docs]: https://v2.tauri.app/
+[time.ParseDuration]: https://golang.org/pkg/time/#ParseDuration
diff --git a/website/docs/segments/languages/fortran.mdx b/website/docs/segments/languages/fortran.mdx
new file mode 100644
index 00000000..85c9155f
--- /dev/null
+++ b/website/docs/segments/languages/fortran.mdx
@@ -0,0 +1,69 @@
+---
+id: fortran
+title: Fortran
+sidebar_label: Fortran
+---
+
+## What
+
+Display the currently active [fortran] compiler version.
+
+:::warning Compiler support
+
+This only works with the [gfortran] compiler.
+
+:::
+
+## Sample Configuration
+
+import Config from "@site/src/components/Config.js";
+
+<Config
+  data={{
+    type: "fortran",
+    style: "powerline",
+    powerline_symbol: "\uE0B0",
+    foreground: "#ffffff",
+    background: "#422251",
+    template: " \udb84\ude1a {{ .Full }} ",
+  }}
+/>
+
+## Properties
+
+| Name                   |    Type    |                                                 Default                                                 | Description                                                                                                                                                                                                                          |
+| ---------------------- | :--------: | :-----------------------------------------------------------------------------------------------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `home_enabled`         | `boolean`  |                                                 `false`                                                 | display the segment in the HOME folder or not                                                                                                                                                                                        |
+| `fetch_version`        | `boolean`  |                                                 `true`                                                  | fetch the gfortran version                                                                                                                                                                                                           |
+| `cache_duration`       |  `string`  |                                                 `none`                                                  | the duration for which the version will be cached. The duration is a string in the format `1h2m3s` and is parsed using the [time.ParseDuration] function from the Go standard library. To disable the cache, use `none`              |
+| `missing_command_text` |  `string`  |                                                                                                         | text to display when the command is missing                                                                                                                                                                                          |
+| `display_mode`         |  `string`  |                                                `context`                                                | <ul><li>`always`: the segment is always displayed</li><li>`files`: the segment is only displayed when file `extensions` listed are present</li><li>`context`: displays the segment when the environment or files is active</li></ul> |
+| `version_url_template` |  `string`  |                                                                                                         | a go [text/template][go-text-template] [template][templates] that creates the URL of the version info / release notes                                                                                                                |
+| `extensions`           | `[]string` | `fpm.toml, *.f, *.for, *.fpp, *.f77, *.f90, *.f95, *.f03, *.f08` + uppercase equivalents (`*.F` etc...) | allows to override the default list of file extensions to validate                                                                                                                                                                   |
+| `folders`              | `[]string` |                                                                                                         | allows to override the list of folder names to validate                                                                                                                                                                              |
+
+## Template ([info][templates])
+
+:::note default template
+
+```template
+{{ if .Error }}{{ .Error }}{{ else }}{{ .Full }}{{ end }}
+```
+
+:::
+
+### Properties
+
+| Name     | Type     | Description                                        |
+| -------- | -------- | -------------------------------------------------- |
+| `.Full`  | `string` | the full version                                   |
+| `.Major` | `string` | major number                                       |
+| `.Minor` | `string` | minor number                                       |
+| `.URL`   | `string` | URL of the version info / release notes            |
+| `.Error` | `string` | error encountered when fetching the version string |
+
+[go-text-template]: https://golang.org/pkg/text/template/
+[templates]: /docs/configuration/templates
+[fortran]: https://fortran-lang.org/
+[gfortran]: https://fortranwiki.org/fortran/show/GFortran
+[time.ParseDuration]: https://golang.org/pkg/time/#ParseDuration
diff --git a/website/sidebars.js b/website/sidebars.js
index 35557dde..d3326e30 100644
--- a/website/sidebars.js
+++ b/website/sidebars.js
@@ -82,7 +82,9 @@ module.exports = {
             "segments/cli/pnpm",
             "segments/cli/quasar",
             "segments/cli/react",
+            "segments/cli/svelte",
             "segments/cli/talosctl",
+            "segments/cli/tauri",
             "segments/cli/terraform",
             "segments/cli/ui5tooling",
             "segments/cli/umbraco",
@@ -127,6 +129,7 @@ module.exports = {
             "segments/languages/dart",
             "segments/languages/dotnet",
             "segments/languages/elixir",
+            "segments/languages/fortran",
             "segments/languages/golang",
             "segments/languages/haskell",
             "segments/languages/java",


Test patch:
diff --git a/src/segments/fortran_test.go b/src/segments/fortran_test.go
new file mode 100644
index 00000000..a58ddf8e
--- /dev/null
+++ b/src/segments/fortran_test.go
@@ -0,0 +1,46 @@
+package segments
+
+import (
+	"fmt"
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+)
+
+func TestFortran(t *testing.T) {
+	cases := []struct {
+		Case           string
+		ExpectedString string
+		Version        string
+	}{
+		{
+			Case:           "GNU Fortran 10.2.1 Debian",
+			ExpectedString: "10.2.1",
+			Version: `GNU Fortran (Debian 10.2.1-6) 10.2.1 20210110
+			Copyright (C) 2020 Free Software Foundation, Inc.
+			This is free software; see the source for copying conditions.  There is NO
+			warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.`,
+		},
+		{
+			Case:           "GNU Fortran 11.4.0 Ubuntu",
+			ExpectedString: "11.4.0",
+			Version: `GNU Fortran (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
+			Copyright (C) 2021 Free Software Foundation, Inc.
+			This is free software; see the source for copying conditions.  There is NO
+			warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.`,
+		},
+	}
+	for _, tc := range cases {
+		params := &mockedLanguageParams{
+			cmd:           "gfortran",
+			versionParam:  "--version",
+			versionOutput: tc.Version,
+			extension:     "*.f",
+		}
+		env, props := getMockedLanguageEnv(params)
+		f := &Fortran{}
+		f.Init(props, env)
+		assert.True(t, f.Enabled(), fmt.Sprintf("Failed in case: %s", tc.Case))
+		assert.Equal(t, tc.ExpectedString, renderTemplate(env, f.Template(), f), fmt.Sprintf("Failed in case: %s", tc.Case))
+	}
+}