using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
public static class SentimentAnalyzer
public static string ClassifyText(string text, Dictionary<string, Dictionary<string, int>> trainingData)
string[] words = text.Split(' ');
double positiveProbability = CalculateSentimentProbability("positive", words, trainingData);
double negativeProbability = CalculateSentimentProbability("negative", words, trainingData);
return positiveProbability >= negativeProbability ? "positive" : "negative";
private static double CalculateSentimentProbability(string sentiment, string[] words, Dictionary<string, Dictionary<string, int>> trainingData)
double probability = 1.0;
if (!trainingData.ContainsKey(sentiment))
Dictionary<string, int> wordCounts = trainingData[sentiment];
int totalWordsInSentiment = wordCounts.Sum(kv => kv.Value);
foreach (string word in words)
if (trainingData["positive"].ContainsKey(word) || trainingData["negative"].ContainsKey(word))
if (wordCounts.ContainsKey(word))
probability *= (double)wordCounts[word] / totalWordsInSentiment;
probability *= 0.00000000000000000001;
public static void Main()
Console.WriteLine("š Discovering and Running Tests...\n");
int totalPassed = 0, totalFailed = 0;
var testClasses = Assembly.GetExecutingAssembly()
.Where(t => t.GetCustomAttribute<TestClassAttribute>() != null);
foreach (var testClass in testClasses)
Console.WriteLine($"š Running tests in: {testClass.Name}");
(int passed, int failed) = RunTests(testClass);
Console.WriteLine("\nš FINAL SUMMARY:");
Console.WriteLine($"ā
Total Passed: {totalPassed}");
Console.WriteLine($"ā Total Failed: {totalFailed}");
Console.WriteLine($"š Total Tests: {totalPassed + totalFailed}");
Console.WriteLine("\nā
Test execution completed.");
private static (int passed, int failed) RunTests(Type testClassType)
object testInstance = Activator.CreateInstance(testClassType);
MethodInfo setupMethod = testClassType
.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
.FirstOrDefault(m => m.GetCustomAttribute<TestInitializeAttribute>() != null);
MethodInfo[] testMethods = testClassType
.GetMethods(BindingFlags.Instance | BindingFlags.Public)
.Where(m => m.GetCustomAttribute<TestMethodAttribute>() != null)
int passed = 0, failed = 0;
foreach (var method in testMethods)
setupMethod?.Invoke(testInstance, null);
method.Invoke(testInstance, null);
Console.WriteLine($" ā
{method.Name} PASSED");
catch (TargetInvocationException ex)
Console.WriteLine($" ā {method.Name} FAILED: {ex.InnerException?.Message ?? ex.Message}");
Console.WriteLine($" ā ļø {method.Name} ERROR: {ex.Message}");
public class SentimentAnalyzerTests
private Dictionary<string, Dictionary<string, int>> _trainingData;
_trainingData = new Dictionary<string, Dictionary<string, int>>
"positive", new Dictionary<string, int>
"negative", new Dictionary<string, int>
public void ClassifyText_PositiveText_ReturnsPositive()
string text = "this is a good and great movie";
string sentiment = SentimentAnalyzer.ClassifyText(text, _trainingData);
Assert.AreEqual("positive", sentiment);
public void ClassifyText_NegativeText_ReturnsNegative()
string text = "this is a bad and terrible movie";
string sentiment = SentimentAnalyzer.ClassifyText(text, _trainingData);
Assert.AreEqual("negative", sentiment);
public void ClassifyText_MixedText_ReturnsPositive()
string text = "this is a good and terrible movie";
string sentiment = SentimentAnalyzer.ClassifyText(text, _trainingData);
Assert.AreEqual("positive", sentiment);
public void ClassifyText_UnknownWords_ReturnsPositive()
string text = "this is an unknown movie";
string sentiment = SentimentAnalyzer.ClassifyText(text, _trainingData);
Assert.AreEqual("positive", sentiment);
public void ClassifyText_EmptyText_ReturnsPositive()
string sentiment = SentimentAnalyzer.ClassifyText(text, _trainingData);
Assert.AreEqual("positive", sentiment);
public void ClassifyText_TextWithOnlyBad_ReturnsNegative()
string text = "bad bad bad";
string sentiment = SentimentAnalyzer.ClassifyText(text, _trainingData);
Assert.AreEqual("negative", sentiment);
public void ClassifyText_TextWithWordFromOneSentiment_ReturnsOtherSentimentWhenOtherWordsAreUnknown()
var trainingData = new Dictionary<string, Dictionary<string, int>>
{ "positive", new Dictionary<string, int> { { "good", 10 } } },
{ "negative", new Dictionary<string, int> { { "bad", 7 } } }
string text = "unknown bad";
string sentiment = SentimentAnalyzer.ClassifyText(text, trainingData);
Assert.AreEqual("negative", sentiment);